2011-06-07 38 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

我想你可以写一个简单的程序,并通过读取所有列,并产生选择