我有一个简单的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语句,
感谢。
答案 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