2015-05-28 38 views
0

我有一個關於SQL的小問題。
我有一個450列的表,我想檢查哪些列至少包含一個空值。
我該怎麼做?如何找到包含一個或多個空值的列?

實施例:

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

應該簡單地返回A1和A2。

+1

萬歲。有人認爲,因爲SQL表格與電子表格有着膚淺的相似之處,所以應該對待它們。 *表非常罕見,因爲表需要這麼寬,特別是如果每​​列中的數據類型具有相同的「類型」(例如,您希望以相同的方式在多列上執行操作),那麼它是指示數據模型已損壞。它可能應該是'Id','A'和'Value'列,其中'A'將包含當前嵌入在列名稱中的* data *,並且將爲任何例如實際上是'7'。 –

回答

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 

(請注意,上述的基本上是輸出)

+0

「你通常需要明確檢查每一列」這讓我想:或許連接所有字段並檢查結果是否爲'NULL'更快? – DaSourcerer

+0

@DaSourcerer這不會告訴你_which_列是NULL。 –

+0

好吧,我理解OP的問題基本上可以通過(謹慎,僞代碼)'SELECT * FROM t1 WHERE GROUP_CONCAT(t1。*)IS NULL'來解決,因此查找具有* any *'NULL'值的列應該足夠了。 – DaSourcerer

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

+0

這會告訴你哪些_rows_有一個空值,但不是哪個_columns_。 –

+0

@DStanley你寫我誤讀了問題..這將做他的要求 – Sachu

相關問題