在 SQL Server 中检查多个值为 NULL 的列
Posted
技术标签:
【中文标题】在 SQL Server 中检查多个值为 NULL 的列【英文标题】:Check multiple columns with value NULL in SQL Server 【发布时间】:2019-10-02 11:38:02 【问题描述】:目前我有以下sql语句:
SELECT CASE
WHEN sd.GV01 IS NULL
AND sd.GV02 IS NULL
AND sd.GV03 IS NULL
AND sd.GV04 IS NULL
AND sd.GV05 IS NULL
AND sd.CountryId = '4' THEN 4
END AS rating
FROM masterData sd
我试图用更简短的定义采取同样的方式:
SELECT CASE
WHEN NULL IN (sd.GV01, sd.GV02, sd.GV03, sd.GV04, sd.GV05)
AND sd.CountryId = '4' THEN 4
END AS rating
FROM masterData sd
但是我没有得到返回值,为什么?谁能给我一个更好的解决方案?
【问题讨论】:
当 coalesce(sd.GV01, ... sd.GV05) 为空时NULL
无法与其他值进行比较。 NULL = NULL
不返回 true
,NULL IN (0,1,NULL)
也不返回;他们都返回NULL
。 附带说明NULL
在使用NOT IN
时表现“奇怪”(但已记录),实际上建议使用NOT EXISTS
。注意这个查询会发生什么:SELECT 1 WHERE 1 NOT IN (0,1,NULL);
即使它是有效的 SQL,也不是同一条语句。首先,您使用的是 AND。在第二个你使用 IN 就像使用很多 OR 一样。
@Zorkolot 哦,对了。谢谢..我忘记了:)
【参考方案1】:
你的方法很好。几乎所有NULL
值的比较都会返回NULL
——这被视为错误。
你可以使用COALESCE()
:
SELECT (CASE WHEN COALESCE(sd.GV01, sd.GV02, sd.GV03, sd.GV04, sd.GV05) IS NULL AND
sd.CountryId = '4'
THEN 4
END) AS rating
FROM masterData sd;
【讨论】:
以上是关于在 SQL Server 中检查多个值为 NULL 的列的主要内容,如果未能解决你的问题,请参考以下文章
如果SQL Server CASE值为NULL,则不返回任何内容
传递值为 null 的变量与传递常量 null 时,Sql Server UDF 的行为不同
SQL Server - CASE 中的 CASE 检查 NULL