如何查找包含一个或多个空值的列?

时间:2015-05-28 14:11:16

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

我对SQL有一个小问题 我有一个450列的表,我想检查哪些列至少包含一个空值 我怎么能这样做?

示例:

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

应该只返回A1和A2。

2 个答案:

答案 0 :(得分:2)

找到具有特定条件的并不是一种简单的方法;您通常需要明确检查每一列。有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

的输出

答案 1 :(得分:0)

以下代码由我在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

table data

columns in the table having null