SQL CASE with multiple WHEN条件不工作



我有两个表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中不应该有任何null。

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

我的查询有问题吗?

可以使用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为null,那么无论如何您都会得到一个null

您可能想在这里使用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.StateNULL,评估就会停止。因此,您需要嵌套序列中下一列的检查,以便正确地对其执行NULL检查。

最新更新