Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查找包含一个或多个空值的列?_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

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

Sql 如何查找包含一个或多个空值的列?,sql,sql-server,sql-server-2014,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。没有简单的方法可以找到具有特定条件的列;通常需要明确检查每一列。有或者你可以有一个有450个比较的大规模查询 另一种方法是UNPIVOT数据: SELECT Id, Col FROM ( S

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

例如:

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

应该只返回A1和A2。

没有简单的方法可以找到具有特定条件的列;通常需要明确检查每一列。有或者你可以有一个有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的输出)

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

试一试


万岁。有人决定,因为SQL表表面上与电子表格相似,所以应该对其进行相同的处理。表很少需要如此宽,尤其是如果每列中的数据类型都是相同的“类型”(这样您就想以相同的方式对多个列进行操作),这表明数据模型已损坏。它可能应该是
Id
A
Value
列,其中
A
将包含当前嵌入列名中的数据,
Value
将以任何名称命名,例如
7
实际上是什么。这将告诉您哪些行有空值,但哪些列没有。@DStanley u r write我误读了问题。.这将完成他的任务“您通常需要显式地检查每一列”这一要求让我思考:也许连接所有字段并检查结果是否为
NULL
?@DaSourcerer会更快,因为它不会告诉您哪一列为NULL。好吧,我理解OP的问题本质上可以通过一个(小心,伪代码)来解决
SELECT*FROM t1,其中GROUP_CONCAT(t1.*)为NULL
,因此查找具有任何
NULL
值的列就足够了。
    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