使用下面的代码,当我使用 case 表达式而不将表连接在一起时,没有问题。
select t1.PNODE_ID, --t2.NODE_ID,
case
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP26,AS_SP15' then 'SP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_SP26' then 'SP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_NP15' then 'NP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP15,AS_NP26' then 'NP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_NP26' then 'ZP26'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_SP15' then 'ZP26'
else 'Unknown'
end as CLEANED_ZONE
from ATL_AS_REGION_MAP t1
--left join ATL_CBNODE t2 on t1.PNODE_ID = t2.NODE_ID
group by
t1.PNODE_ID
--t2.NODE_ID
但是,当我尝试将表连接在一起时,只要有匹配的 NODE_ID 名称,就会调用“else”表达式。如果没有匹配的 NODE_ID 名称,则 case 表达式按预期执行。
我想了解为什么会发生这种情况以及如何将表与 case 表达式适当地连接在一起。
case 表达式是根据以下列输出定义的:
select t1.PNODE_ID, STRING_AGG(t1.AS_REGION_ID, ',') as AGG_STRING, t2.NODE_ID,
case
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP26,AS_SP15' then 'SP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_SP26' then 'SP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_NP15' then 'NP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP15,AS_NP26' then 'NP15'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_NP26' then 'ZP26'
when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_SP15' then 'ZP26'
else 'Unknown'
end as CLEANED_ZONE
from ATL_AS_REGION_MAP t1
left join ATL_CBNODE t2 on t1.PNODE_ID = t2.NODE_ID
group by
t1.PNODE_ID,
t2.NODE_ID
您可以在左连接之前在 CTE 中解析这些区域(与没有左连接时的操作方式相同,您发现它工作正常):
;with cte as (
select
t1.PNODE_ID,
case
when STRING_AGG(t1.AS_REGION_ID, ',') in ('AS_SP26,AS_SP15','AS_SP15,AS_SP26') then 'SP15'
when STRING_AGG(t1.AS_REGION_ID, ',') in ('AS_NP26,AS_NP15','AS_NP15,AS_NP26') then 'NP15'
when STRING_AGG(t1.AS_REGION_ID, ',') in ('AS_SP15,AS_NP26','AS_NP26,AS_SP15') then 'ZP26'
else 'Unknown'
end as CLEANED_ZONE
from ATL_AS_REGION_MAP t1
group by t1.PNODE_ID
)
select
cte.PNODE_ID,
atl.NODE_ID,
cte.CLEANED_ZONE
from
cte
left join ATL_CBNODE atl
on cte.PNODE_ID = atl.NODE_ID;