SQL查询需求:筛选不含指定数字且包含空值的行
解决SQL筛选不包含指定数字且处理空值的问题
嘿,我来帮你搞定这个问题!你的原SQL语句之所以选不到包含空值的行,核心原因是SQL中NULL和任何值做比较都会返回UNKNOWN,而逻辑判断里UNKNOWN会被当作false处理,导致那些带空值的行被错误过滤掉了。
原语句的问题分析
假设某一行的col1是NULL,col2和col3都是1,原语句的条件(col1 != 1 or col2 != 1 or col3 != 1)会拆解为:
col1 !=1→ UNKNOWNcol2 !=1→ falsecol3 !=1→ false
整个OR表达式的结果是UNKNOWN OR false OR false,最终返回UNKNOWN,不会被判定为true,所以这行不会被选中,但实际上这行的col1是NULL(并非1),应该符合筛选条件。
正确的SQL写法
如果你的需求是筛选出所有列都不包含指定数字(这里是1)的行(允许列值为NULL),可以用最直观的写法:
SELECT * FROM table WHERE (col1 IS NULL OR col1 != 1) AND (col2 IS NULL OR col2 != 1) AND (col3 IS NULL OR col3 != 1);
要是你的需求是只要有一列不是1(包括NULL)就选中该行,只需要把上面的AND换成OR即可:
SELECT * FROM table WHERE (col1 IS NULL OR col1 != 1) OR (col2 IS NULL OR col2 != 1) OR (col3 IS NULL OR col3 != 1);
关键提醒
在SQL里处理NULL一定要用IS NULL或IS NOT NULL,绝对不能用普通的比较运算符(=、!=、<>等)——这些运算符和NULL比较永远返回UNKNOWN,会直接打乱你的逻辑判断结果。
内容的提问来源于stack exchange,提问作者Martynas
相关产品推荐
相关产品推荐

