我对SQL有一个小问题 我有一个450列的表,我想检查哪些列至少包含一个空值 我怎么能这样做?
示例:
Id A1 A2 A3 A4
1 NULL 1 5 6
2 4 NULL 2 1
3 3 4 5 7
应该只返回A1和A2。
答案 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