TSQL - 多列上的ISNULL

时间:2011-06-07 13:05:21

标签: sql sql-server-2005 tsql

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

这些列中有相当多的列,在我的查询中,如果值为NULL,我想返回零。 我现在正在使用ISNULL:

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

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

SELECT ISNULL(*,0) FROM FoodPreferences

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

感谢。

6 个答案:

答案 0 :(得分:7)

试试这个:

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

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


<强>更新

结论是:

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

答案 1 :(得分: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, '')

结果:

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

答案 2 :(得分: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

答案 3 :(得分:2)

不幸的是,简单的答案是no

你可以动态编写sql,但无论发生什么,最终生成的sql都必须是ISNULL(a,0), ISNULL(b,0), ISNULL(c,0), ISNULL(d,0), etc

答案 4 :(得分:1)

我认为您可以编写一个简单的程序并通过读取所有列并生成select

来生成select子句

答案 5 :(得分:-1)

不是这样的:

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

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/coalesce-transact-sql?view=sql-server-2017