2011-06-07 100 views
5

我有一個簡單的SQL查詢(SQL Server 2005),我從包含多個具有BIT值的列的表中進行選擇。 這些列可以爲空,因此可以包含NULL,0或1.多列TSQL - ISNULL

這些列的數目相當多,在我的查詢中,如果值爲NULL,我想返回零。 我目前使用ISNULL像這樣:

SELECT Name, Age, ISNULL(LikesOranges,0), ISNULL(LikesApples,0), ISNULL(LikesPears,0) 
FROM FoodPreferences 

正如我所提到的,有很多這些BIT列(比上面的更復雜的工作)的。 有沒有一種方法,我可以使用ISNULL在多列這樣的:

SELECT ISNULL(*,0) FROM FoodPreferences 

上面的查詢不工作,但你得到什麼,我試圖做的 - 所以我就可以避免寫一個ISNULL聲明對於每一列,

謝謝。

+0

你需要的列可爲空? – codeulike 2011-06-07 13:17:19

+0

是的,我無法以任何方式修改表 – 2011-06-07 13:19:55

回答

7
生成SELECT子句

所以我可以避免必須寫一個 ISNU每列的LL語句,

運行此查詢並將結果複製到您的select語句。 system_type_id = 104bit列上過濾結果。

select stuff((select ', isnull('+name+', 0)' 
       from sys.columns 
       where object_id = object_id('FoodPreferences') and 
        system_type_id = 104 
       for xml path('')), 1, 1, '') 

結果:

------------------------------------------------------------------------- 
isnull(LikesOranges, 0), isnull(LikesApples, 0), isnull(LikesPears, 0) 
+1

這是一個很好的解決問題的方法 - 這是一種創造性思維,使SO成爲一種寶貴的資源。謝謝。 – 2011-06-08 08:37:33

3

我不這麼認爲。但是一個選項可能是在該表上創建一個視圖,並將所有ISNULL語句放在視圖中。至少你不必每次都這麼做

例如,

CREATE VIEW vwFoodPreferences 
AS 
SELECT Name, 
     Age, 
     ISNULL(LikesOranges,0) AS LikesOranges, 
     ISNULL(LikesApples,0) AS LikesApples, 
     ISNULL(LikesPears,0) AS LikesPears 
FROM FoodPreferences 
2

不幸的是,簡單的答案是no

你可以動態地寫SQL,但是無論發生什麼事,最後得到的SQL將不得不ISNULL(a,0), ISNULL(b,0), ISNULL(c,0), ISNULL(d,0), etc

5

試試這個:

SELECT COALESCE(LikesOranges, LikesApples, LikesPears) AS MyBit FROM FoodPreferences 

這將返回第一個非空值。如果所有字段都爲NULL,則結果爲NULL。


UPDATE:

而得出的結論是:

SELECT ISNULL(COALESCE(LikesOranges, LikesApples, LikesPears),0) AS MyBit FROM FoodPreferences 
+1

這不是問什麼。問題是將每列數據作爲ISNULL參數。 – Dalex 2011-06-07 13:27:46

+0

是的,但它只是一步之遙。讓他們最後做飯。 :) – ibram 2011-06-07 13:33:16

+0

我認爲他意味着他有很多可空列,並且希望在eahc列上單獨使用ISNULL(而不是多列合併),而不必實際鍵入每個列名稱。 – MatBailie 2011-06-07 13:36:36

1

我想你可以寫一個簡單的程序,並通過讀取所有列,併產生選擇