Sql 如何查找包含一个或多个空值的列?
我有一个关于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
我有一个包含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