具有两列的案例表达

时间:2016-08-29 21:27:17

标签: sql sql-server

我在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语句在搜索的情况下是真的,但它没有放置值反过来。它给了我一个空值,即使上面的一个是真的,结果不应该(我不认为至少)是一个空值。

我已编辑了我的第一个示例,其中包含列名/普通英语。

2 个答案:

答案 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子句)。