我有两个名为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。
我的查询有问题吗?
答案 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
检查。