我需要在SQL语句中检查列是否为NULL。
我的SQL查询:
select column_a, column_b, column_c, column_d, column_x
from myTable
我的选择中有很多列。所以我遇到了性能问题,如果我会这样做:
select column_a, column_b, column_c, column_d, column_x
from myTable
where column_a is not null or column_b is not null or column_c is not null
or column_x is not null
是否有另一种(更好的)方法来检查是否有任何列为NOT NULL?
答案 0 :(得分:25)
您可以使用COALESCE
。 COALESCE
返回第一个非null值(如果有)。这可能不会更好,但更具可读性。
示例:强>
where coalesce(column_a, column_b, column_c, column_x) is not null
根据数据的基数,您可以添加索引以帮助提高性能。
另一种可能性是使用持久计算列来告诉您是否所有四列都是NULL。
答案 1 :(得分:3)
攻击此方法的一种方法可能是添加一个额外的位列,以跟踪是否存在任何值。
<强>赞成强>
<强>缺点强>
专业人士是否胜过利弊取决于你通过查看其他专栏所带来的性能影响程度。在提交之前对其进行剖析!
答案 2 :(得分:2)
我一般都喜欢@ RedFilter对COALESCE的建议,但另一种解决方案可能是使用CHECKSUM()函数。当然,所有NULL的校验和的值取决于列和数据类型,因此您需要首先运行查询以获取该值。类似的东西:
select CHECKSUM(*) AS [All_NULL_Value]
from myTable
where column_a is null
AND column_b is null
AND column_c is null
AND column_d is null
AND column_x is null
然后你可以这样做:
select column_a, column_b, column_c, column_d, column_x
from myTable
where CHECKSUM(*) <> {All_NULL_Value_obtained_above}
我不确定这是否比COALESCE的想法更好或更差,但可能值得一试。
答案 3 :(得分:0)
5年前接受了答案,但是,正如布拉德所说,问题标题合并是错误的方法。如果在某些情况下您确实需要检查或ANY参数为null,则可以使用:
where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null