【发布时间】:2015-07-17 04:17:28
【问题描述】:
我想编写一个 TSQL 查询,它独立检查表中的一组列,以查看哪些列至少包含一个非空值。每列的检查应相应地返回 T/F (1/0)。
首先想到的是使用COUNT 聚合函数。由于COUNT(expression) 从结果总数中排除空值,如果COUNT > 0,则存在非空数据。
这似乎有点笨拙,因为它必须计算所有数据。我真的只需要知道每列中是否至少有一个非空值:
SELECT
CAST(CASE WHEN COUNT(t.Column1) > 0 THEN 1 ELSE 0 END AS BIT) AS HasColumn1Data,
CAST(CASE WHEN COUNT(t.Column2) > 0 THEN 1 ELSE 0 END AS BIT) AS HasColumn2Data,
CAST(CASE WHEN COUNT(t.Column3) > 0 THEN 1 ELSE 0 END AS BIT) AS HasColumn3Data,
CAST(CASE WHEN COUNT(t.Column4) > 0 THEN 1 ELSE 0 END AS BIT) AS HasColumn4Data
FROM dbo.Table AS t
WHERE t.TimeStamp BETWEEN @StartTimeStamp AND @EndTimeStamp
有什么更好的想法吗?
【问题讨论】:
-
我会省略
cast(),只返回0和1。 -
感谢您的回复,但为什么删除演员表会有影响?
-
如果你想留在 case 你可以删除 case 表达式。在位数据类型中,任何 >= 1 的值都将变为 1。 CAST(COUNT(t.Column1) as bit)
-
仅供参考:计数比我们自己编写的任何东西都要快得多。 (如果有可以利用的索引,可能除外。即使那样也不确定)
标签: sql sql-server tsql