【问题标题】:How can I find columns that contain one or more null values?如何找到包含一个或多个空值的列?
【发布时间】:2015-05-29 00:22:46
【问题描述】:

我有一个关于 SQL 的小问题。
我有一个包含 450 列的表,我想检查其中哪些列至少包含一个空值。
我该怎么做?

例子:

Id A1   A2   A3   A4
1  NULL 1    5    6
2  4    NULL 2    1
3  3    4    5    7

应该简单地返回 A1 和 A2。

【问题讨论】:

  • 万岁。有人决定,因为 SQL 表与电子表格有表面上的相似之处,所以应该同样对待它。表非常罕见需要这么宽,尤其是如果每列中的数据类型是相同的“类型”(例如,您想对同一列中的多个列进行操作)方式),这表明数据模型已损坏。它可能应该是IdAValue 列,其中A 将包含当前嵌入在列名中的数据,而Value 将以任何名称命名,例如7 实际上是。

标签: sql sql-server sql-server-2014


【解决方案1】:

没有一种简单的方法可以找到具有特定条件的;您通常需要明确检查每一列。有ways to do it dynamically 或者您可以只进行包含 450 次比较的海量查询。

另一种方法是UNPIVOT数据:

SELECT Id, Col FROM 
(
    SELECT Id, Col, Val
    FROM 
       (SELECT Id, A1, A2, ...
       FROM pvt) p
    UNPIVOT
       (Val FOR Id IN 
          (A1, A2, ...)
    )AS unpvt
)
WHERE Val is NULL

如果这是一种常见的实时需求(而不仅仅是一次性或批量需求),一个更好的长期解决方案是更改您的数据结构,使每个“列”与值一起成为一行:

Id  Col  Val
--- ---- ----
1   A1   NULL
1   A2   1
1   A3   5
1   A4   6
2   A1   4
2   A2   NULL

等等

(注意上面本质上是UNPIVOT的输出)

【讨论】:

  • “您通常需要明确检查每一列”这让我想到:连接所有字段并检查结果是否为 NULL 可能更快?
  • @DaSourcerer 这不会告诉你哪个列是NULL。
  • 好吧,我理解 OP 的问题基本上可以通过(小心,伪代码)SELECT * FROM t1 WHERE GROUP_CONCAT(t1.*) IS NULL 解决,因此找到具有 any NULL 值的列就足够了。
【解决方案2】:

下面的代码是我在sql server中使用的

试试

    DECLARE @dbname VARCHAR(100) = 'ur_Database'
DECLARE @schemaName VARCHAR(100) = 'dbo'
DECLARE @tableName VARCHAR(100) = 'ur_Table'
DECLARE @result TABLE (col VARCHAR(4000))

SELECT  @dbname dbname
        ,t.name tbl
        ,c.name col
INTO    #temp
FROM    sys.columns c
JOIN    sys.tables t ON 
        t.object_id = c.object_id
WHERE   c.is_nullable = 1
AND     t.name = @tableName

DECLARE @sql NVARCHAR(MAX) =
STUFF(
(
    SELECT  'UNION ALL SELECT CASE WHEN EXISTS (SELECT 1 FROM ' + @dbname + '.' + @schemaName + '.' + tbl + ' WHERE ' + col + ' IS NULL) THEN '''+ @schemaName  + '.' + tbl + '.' + col+''' END AS NULL_Value_Exists '
    FROM    #temp
    FOR     XML PATH('')
), 1, 10, '   ')

INSERT @result
EXEC(@sql)

SELECT  *
FROM    @result
WHERE   col IS NOT NULL

DROP TABLE #temp

【讨论】:

  • 这会告诉你哪些 rows 有空值,而不是哪些 columns
  • @DStanley 你写我误读了这个问题..这将满足他的要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多