检查是否有任何列是非NULL

时间:2012-01-03 16:28:16

标签: sql sql-server tsql

我需要在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?

4 个答案:

答案 0 :(得分:25)

您可以使用COALESCECOALESCE返回第一个非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