在 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 不返回 trueNULL 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 的行为不同

vb+sql 求和值为null时怎么处理?

SQL Server - CASE 中的 CASE 检查 NULL

WHERE子句中的SQL Server CASE表达式以检查NULL值

如何在 SQL Server 中检查 Is not Null 和 Is not Empty 字符串?