用INSTR()筛选无元音职位员工:两款SQL语句哪个正确?
SQL语句对比:筛选jobrole不含元音的员工
现有EMP表包含name、id、jobrole、joining date字段,jobrole的取值是mgr、hr、sd、se,需求是筛出**jobrole里不含元音(A/E/I/O/U,不区分大小写)**的员工——说白了就是要排除se,因为它带元音e。下面两款用INSTR()函数写的SQL语句,哪款能得到正确结果?
语句1
SELECT * FROM EMP WHERE INSTR(JOBROLE , 'A',1,1)=0 AND INSTR(JOBROLE, 'E',1,1)=0 AND INSTR(JOBROLE,'I',1,1)=0 AND INSTR( JOBROLE, 'O',1,1)=0 AND INSTR(JOBROLE , 'U',1,1)=0;
语句2
SELECT * FROM EMP WHERE NOT (INSTR(JOBROLE , 'A',1,1)!=0 OR INSTR(JOBROLE, 'E',1,1)!=0 OR INSTR(JOBROLE,'I',1,1)!=0 OR INSTR(JOBROLE, 'O',1,1)!=0 OR INSTR(JOBROLE , 'U',1,1)!=0);
结论:两款语句逻辑完全等价,都能得到正确结果
先明确INSTR()函数的作用:它用来查找字符在字段中的位置,找到就返回位置数值,找不到则返回0。这里默认数据库字符集不区分大小写(或jobrole存储为大写),否则匹配大写元音会漏掉小写元音的情况。
- 语句1逻辑直白:要求
jobrole同时不存在A、E、I、O、U这5个元音,也就是每个元音的INSTR结果都为0。对应现有jobrole取值:mgr、hr、sd不带元音,会被选中;se包含元音e,INSTR(JOBROLE, 'E')会返回有效位置(不等于0),因此被排除,完全符合需求。 - 语句2则是运用了逻辑中的德摩根定律:
NOT (A OR B OR C)和NOT A AND NOT B AND NOT C完全等价。翻译过来就是“不是(含A或含E或含其他元音)”,和语句1“同时不含所有元音”的逻辑一致,最终筛选结果完全相同。
补充说明
如果你的数据库INSTR()区分大小写,且jobrole存储为小写(比如se),那两款语句中的大写元音匹配会返回0,导致se被错误选中。此时只需把语句里的大写元音改成小写(a、e、i、o、u),或者先将jobrole转为小写再匹配即可。
内容的提问来源于stack exchange,提问作者Mohammed Raheel
相关产品推荐
相关产品推荐

