TSQL - 多列上的ISNULL

Chr*_*s B 6 sql t-sql sql-server-2005

我有一个简单的SQL查询(SQL Server 2005),我从一个包含多个具有BIT值的列的表中进行选择.这些列可以为空,因此可以包含NULL,0或1.

有相当数量的这些列,在我的查询中,如果值为NULL,我想返回零.我目前正在使用ISNULL:

SELECT Name, Age, ISNULL(LikesOranges,0), ISNULL(LikesApples,0), ISNULL(LikesPears,0)
FROM FoodPreferences
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,有很多这些BIT专栏(远远超过上面的简单示例).有没有办法可以在多列上使用ISNULL,如下所示:

SELECT ISNULL(*,0) FROM FoodPreferences
Run Code Online (Sandbox Code Playgroud)

上面的查询不起作用,但你得到我正在尝试做的事情 - 所以我可以避免为每列写一个ISNULL语句,

谢谢.

ibr*_*ram 8

试试这个:

SELECT COALESCE(LikesOranges, LikesApples, LikesPears) AS MyBit FROM FoodPreferences
Run Code Online (Sandbox Code Playgroud)

这将返回第一个非null值.如果所有字段都为NULL,则结果为NULL.


更新:

结论是:

SELECT ISNULL(COALESCE(LikesOranges, LikesApples, LikesPears),0) AS MyBit FROM FoodPreferences
Run Code Online (Sandbox Code Playgroud)


Mik*_*son 7

所以我可以避免为每列写一个ISNULL语句,

运行此查询并将结果复制到select语句.system_type_id = 104过滤bit列上的结果.

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, '')
Run Code Online (Sandbox Code Playgroud)

结果:

-------------------------------------------------------------------------
 isnull(LikesOranges, 0), isnull(LikesApples, 0), isnull(LikesPears, 0)
Run Code Online (Sandbox Code Playgroud)