我在SQL Server 2008中有一个使用以下语法
的case语句case
when [Phone1] = 'Cell' then [CellNumber]
when [Phone1] = 'Home' then [HomeNumber]
when [Phone1] = 'Work' then [WorkNumber]
when [Phone2] = 'Cell' then [CellNumber2]
when [Phone2] = 'Home' then [HomeNumber2]
when [Phone2] = 'Work' then [WorkNumber2]
else [CellNumber]
end as [PrimaryPhone]
语句本身运行良好,但它不会使用我的else语句。如果我把其他'TextExample',它会把它放在我的结果中,但我不能让它在null值的结果中输出Column1。
我也试过以下无济于事。
case
when [ColumnX] = 'Value1' then [Column1]
when [ColumnX] = 'Value2' then [Column2]
when [ColumnX] = 'Value3' then [Column3]
when [ColumnY] = 'Value1' then [Column4]
when [ColumnY] = 'Value2' then [Column5]
when [ColumnY] = 'Value3' then [Column6]
when [Column X] is null and [Column Y]is null then [Column1]
else [Column1]
end as [ColumnName]
这是我的一个例子 Output from query
我希望ColumnName始终用第1-6列填充,但是else总是被忽略,我假设是因为上面的一个if语句在搜索的情况下是真的,但它没有放置值反过来。它给了我一个空值,即使上面的一个是真的,结果不应该(我不认为至少)是一个空值。
我已编辑了我的第一个示例,其中包含列名/普通英语。
答案 0 :(得分:1)
coalesce(case
when [ColumnX] = 'Value1' then [Column1]
when [ColumnX] = 'Value2' then [Column2]
when [ColumnX] = 'Value3' then [Column3]
when [ColumnY] = 'Value1' then [Column4]
when [ColumnY] = 'Value2' then [Column5]
when [ColumnY] = 'Value3' then [Column6]
end, [Column1]) as [ColumnName]
您需要coalesce()
的原因是,即使您根据其他两列中的值选择了六列中的一列,您也无法确保相应的值不是空值。 coalesce()
表示缺少计算值的位置,默认使用Column1
。如有必要,您可以通过这种方式进行扩展:
coalesce(
...
end, [Column1], [Column2], [Column3] ...) as [ColumnName]
只要标记的值不为空,您的第一次尝试看起来应该有效。这似乎不应该发生,所以也许这就是问题所在。
答案 1 :(得分:0)
您需要将空比较移动到CASE
语句的开头。你的第二种方法更适合。您应该(有意义)检查[Column X] IS NULL
,然后检查[Column Y] IS NULL
,然后检查两者(带AND
子句)。