2010-04-22 56 views
1

我有以下問題。我有一個數據庫中的表,有很多列。我可以做不同的選擇查詢,顯示,例如,每個滿足條件的記錄:SQL count NULL cells

  • 所有細胞列在_t0
  • 從列的所有細胞的名稱在_t1結尾的結尾的名稱
  • ...

要得到列清單,以我使用的信息模式的查詢。

現在,問題:每個查詢返回一個記錄與大表的列的子集。這意味着我可以得到一行(all!)NULL。我怎樣才能讓我的查詢拒絕這樣的行,而不必明確地輸入列名(即通過說col_1不爲空,col_2不爲空......)?可能嗎?

在此先感謝!

+1

您正在使用哪種數據庫系統? MySQL,SQL Server,Oracle? – 2010-04-22 08:19:47

+0

你在那張桌子上有一個主鍵嗎? – 2010-04-22 14:50:30

+1

[一般觀察]帶有圓柱的桌子爲我提供警鐘。 – 2010-04-25 12:48:51

回答

0

我一直在尋找同樣的,我不認爲這是可能的。

唯一體面的解決辦法似乎是他們的名字,從Bytes.com

SELECT 
CASE WHEN patientid IS NULL THEN 1 ELSE 0 END+ 
CASE WHEN age IS NULL THEN 1 ELSE 0 END+ 
CASE WHEN weight IS NULL THEN 1 ELSE 0 END+ 
CASE WHEN height IS NULL THEN 1 ELSE 0 END+ 
CASE WHEN race IS NULL THEN 1 ELSE 0 END 
FROM tblPatientDemographics 

當然,這不好玩,所以我寫了一些動態SQL爲我做到這一點。幾乎沒有優雅,但我不確定有更好的方法。

DECLARE @tableName SYSNAME 
DECLARE @sql VARCHAR(MAX) 
DECLARE @sqltail VARCHAR(MAX) 
-- loop through all the fields in a table. 
DECLARE @colName SYSNAME 
SET @tableName = 'YourTableName' 
DECLARE crsCol CURSOR FORWARD_ONLY READ_ONLY 
FOR 
    SELECT name 
    FROM syscolumns 
    WHERE id = OBJECT_ID(@tableName) 
    ORDER BY colid 
OPEN crsCol 
SET @sql = '' 
SET @sqltail = 'FROM [' + @tableName + ']' 
FETCH NEXT FROM crsCol INTO @colName 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF @sql = '' 
      SET @sql = 'SELECT /* Add Your PK Fields here, */ NullCount = ' 
     ELSE 
      SET @sql = @sql + '+ ' 

     SET @sql = @sql + 'CASE WHEN [' + @colName + '] IS NULL THEN 1 ELSE 0 END ' 

     FETCH NEXT FROM crsCol INTO @colName 
    END 
CLOSE crsCol 
DEALLOCATE crsCol 
PRINT (@sql + @sqltail) 
EXEC(@sql + @sqltail)