SQL如何筛选表数据,排除status为1且type为X的客户记录
SQL查询语句修正方案
原语句错误点
- 逻辑运算符优先级错误:SQL中
AND优先级高于OR,原语句实际执行逻辑会被解析为c.status = 1 OR (c.status = 3 AND c.status !=1 AND c.type !=x ),和需求完全不符 - 字符串值未加引号:
type字段存储的是字符串类型值,X需要用单引号包裹,否则会被识别为字段名触发报错 - 逻辑条件偏离需求:你需要的是仅排除同时满足
status=1且type=X的记录,原条件没有匹配这个逻辑
正确写法
按照你的需求,最直观的实现是直接对要排除的组合条件取反:
SELECT * FROM client c WHERE NOT (c.status = 1 AND c.type = 'X')
如果不习惯用NOT包裹组合条件,也可以按照德摩根定律拆成等价的正向条件:
SELECT * FROM client c WHERE c.status != 1 OR c.type != 'X'
注:以上两种写法逻辑完全等价,执行结果一致,会排除唯一符合
status=1且type=X的id=100记录,返回id为101、102、103、104的四条记录。
如果你需要最终结果仅返回id为101、102、104的三条记录,说明你还需要额外排除status=4的记录,调整后语句如下:
SELECT * FROM client c WHERE NOT (c.status = 1 AND c.type = 'X') AND c.status != 4
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

