2013-01-23 81 views
9

我正在嘗試創建一個查詢,該查詢將返回所有除1列外所有具有空值的行。某些行在某處會有多個空條目。有一列我想排除,因爲此時所有條目都爲空,並且它是唯一允許有空值的列。我被卡住了,因爲我不知道如何在WHERE中包含所有的列。在任何列中查找具有空值的所有行

SELECT * 
FROM Analytics 
WHERE * IS NULL 

或者,我可以對一列進行計數,但該表有大約67列。

SELECT COUNT(*) 
FROM Analytics 
WHERE P_Id IS NULL 
+0

您必須手動完成。你需要列出所有的列。您可以使用TSQL生成此列表,並通過查找表模式執行它,然後生成列出所有67列的TSQL。但沒有一種簡單的方法可以在一個語句中檢查多個列的值,如'* IS NULL' –

+5

您使用的是什麼RDBMS和版本? – Lamak

+0

這是SQLServer 2005:'[。我想我可能不得不單獨做。 –

回答

8

在SQL Server中,你可以從this answer

;WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' as ns) 
SELECT * 
FROM Analytics 
WHERE (SELECT Analytics.* 
     FOR xml path('row'), elements xsinil, type 
     ).value('count(//*[local-name() != "colToIgnore"]/@ns:nil)', 'int') > 0 

SQL Fiddle

借用的想法很有可能構造查詢與67列將更有效率但它節省了一些輸入或需要動態SQL來生成它。

0

取決於哪個RDBMS你使用,我認爲你唯一的選擇(而不是明確地說WHERE col1 IS NULL and col2 IS NULL and col3 IS NULL ...)是使用動態SQL。

例如,如果你想從一個SQL Server數據庫中的所有列名,你可以使用這樣的返回那些名字:

SELECT 
    name 
FROM 
    sys.columns 
WHERE 
    object_id = OBJECT_ID('DB.Schema.Table') 

你可以使用FOR XML創建您的WHERE子句:

SELECT Name + ' IS NULL AND ' AS [text()] 
FROM sys.columns c1 
WHERE  object_id = OBJECT_ID('DB.Schema.Table') 
ORDER BY Name 
FOR XML PATH('') 

希望這可以幫助你開始。

祝你好運。

+0

我在想這個,但你可以把結果放到一個臨時表中嗎? –

0

我沒有這樣的表來測試,假設沒有'x'作爲任何字段中的數據,我認爲這應該在Sql-Server上工作; (DEMO

注:我已篩選keyColumn作爲c.name != 'keyColumn'

DECLARE @S NVARCHAR(max), @Columns VARCHAR(50), @Table VARCHAR(50) 

SELECT @Columns = '66', --Number of cols without keyColumn 
     @Table = 'myTable' 

SELECT @S = ISNULL(@S+'+ ','') + 'isnull(convert(nvarchar, ' + c.name + '),''x'')' 
FROM sys.all_columns c 
WHERE c.object_id = OBJECT_ID(@Table) AND c.name != 'keyColumn' 

exec('select * from '[email protected]+' where ' + @S + '= replicate(''x'',' + @Columns + ')') 
相關問題