我有一個關於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的小問題。
我有一個450列的表,我想檢查哪些列至少包含一個空值。
我該怎麼做?如何找到包含一個或多個空值的列?
實施例:
Id A1 A2 A3 A4
1 NULL 1 5 6
2 4 NULL 2 1
3 3 4 5 7
應該簡單地返回A1和A2。
有沒有簡單的方法找到列具有特定條件;你通常需要明確檢查每一列。有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
等
(請注意,上述的基本上是輸出)
「你通常需要明確檢查每一列」這讓我想:或許連接所有字段並檢查結果是否爲'NULL'更快? – DaSourcerer
@DaSourcerer這不會告訴你_which_列是NULL。 –
好吧,我理解OP的問題基本上可以通過(謹慎,僞代碼)'SELECT * FROM t1 WHERE GROUP_CONCAT(t1。*)IS NULL'來解決,因此查找具有* any *'NULL'值的列應該足夠了。 – DaSourcerer
下面的代碼在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你寫我誤讀了問題..這將做他的要求 – Sachu
萬歲。有人認爲,因爲SQL表格與電子表格有着膚淺的相似之處,所以應該對待它們。 *表非常罕見,因爲表需要這麼寬,特別是如果每列中的數據類型具有相同的「類型」(例如,您希望以相同的方式在多列上執行操作),那麼它是指示數據模型已損壞。它可能應該是'Id','A'和'Value'列,其中'A'將包含當前嵌入在列名稱中的* data *,並且將爲任何例如實際上是'7'。 –