如何用SQL查询同时获取同一列中的NULL值和指定值(如2)
SQL怎么同时查询某列的NULL和值为2的记录?
为啥你之前的写法不生效
IN (2, NULL)查不到NULL是因为SQL里NULL不能用普通的等于、IN来匹配,任何和NULL的比较结果都是“不确定”,不会被筛选出来。- 你写的
AND columName = 2 OR columName IS NULL只返回值为2的记录,大概率是运算符优先级搞的鬼:AND比OR优先级高,要是你的WHERE子句前面还有其他条件,比如WHERE 其他条件 AND columName=2 OR columName IS NULL,实际会被解析成(其他条件 AND columName=2) OR columName IS NULL,要是其他条件对NULL那条记录不成立,自然就只返回columName=2的了。
正确写法
1. 用括号明确逻辑优先级(有其他条件必用)
不管有没有其他查询条件,把columName=2 OR columName IS NULL用括号包起来,确保逻辑正确:
WHERE (columName = 2 OR columName IS NULL) -- 要是有其他条件,比如: WHERE 其他字段 = '某值' AND (columName = 2 OR columName IS NULL)
2. 用COALESCE转换NULL后筛选
把NULL转换成一个业务中不会出现的特殊值,再用IN匹配:
WHERE COALESCE(columName, -1) IN (2, -1)
这里的-1只是示例,换成你业务里columName绝不会出现的值即可。
3. 部分数据库支持的简便写法
像PostgreSQL、SQLite这类数据库支持IS NOT DISTINCT FROM运算符,可以这么写:
WHERE columName IS NOT DISTINCT FROM 2 OR columName IS NOT DISTINCT FROM NULL
不过这个写法不如第一种直观,还是优先推荐括号包裹的写法。
测试验证
用你提供的测试数据:
columName 2 NULL
执行WHERE (columName = 2 OR columName IS NULL)会返回两条记录,完全符合需求。
内容的提问来源于stack exchange,提问作者Tal Dayan
相关产品推荐
相关产品推荐

