多个WHEN条件不起作用的SQL CASE

时间:2014-07-02 07:53:42

标签: sql

我有两个名为tblPostCode(State,SALES_AREA)的表,tblDirectSalesArea AS DSA_HK(SALES_AREA)和一个名为vwPxPAxWeb(SALES_AREA)的视图

我试图用以下逻辑获取数据

IF dbo.tblPostCode.State IS NULL USE vwPxPaxweb.SALES_AREA,
IF vwPxPaxweb.SALES_AREA IS ALSO NULL THEN USE DSA_HK.SALES_AREA 

ELSE USE  DSA_HK.SALES_AREA  END END AS SALES_AREA_DESC

我使用的SQL查询如下

CASE WHEN dbo.tblPostCode.State IS NULL THEN vwPxPaxweb.SALES_AREA 

WHEN vwPxPaxweb.SALES_AREA IS  NULL THEN DSA_HK.SALES_AREA ELSE 

DSA_HK.SALES_AREA END END AS SALES_AREA_DESC

请注意,表tblDirectSalesArea AS DSA_HK中的数据永远不会为NULL。在最终结果中,SALES_AREA_DESC字段中不应存在任何NULLS。

但是我没有得到我预期的结果,因为在SALES_AREA_DESC字段中出现了NULLS。

我的查询有问题吗?

2 个答案:

答案 0 :(得分:2)

您可以使用COALESCE运算符管理您的一个嵌套案例。

case when dbo.tblPostCode.State IS NULL 
  then coalesce(vwPxPaxweb.SALES_AREA, DSA_HK.SALES_AREA )
else DSA_HK.SALES_AREA end as SALES_AREA_DESC

现在,如果DSA_HK.SALES_AREA为空,无论如何你都会得到一个空。

答案 1 :(得分:1)

您可能希望在此使用COALESCE,如下所示:

SELECT 
CASE
WHEN dbo.tblPostCode.State IS NULL THEN
    CASE
    WHEN vwPxPaxweb.SALES_AREA IS NULL THEN DSA_HK.SALES_AREA
    ELSE vwPxPaxweb.SALES_AREA
    END
ELSE DSA_HK.SALES_AREA
END
FROM <your_data_source>

请注意,这与拉斐尔的回答几乎相同。我只是稍微详细一些,以证明使用嵌套的CASE语句。

CASE遵循短路逻辑 - 它会在满足第一个条件的情况下停止评估。因此,在原始实施中,只要dbo.tblPostCode.State被发现为NULL,评估就会停止。因此,您需要为序列中的下一列嵌套检查,以便对其进行NULL检查。