You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:57:42