SQL JOIN时如何实现字段非空关联该列、为空则关联其他列
核心解决思路
你需要的「State字段非空用State关联,State为空则回退到国家字段关联」的逻辑可以直接在JOIN阶段实现,不需要修改SELECT段已有的CASE语句。
原代码错误点
- SQL中判断空值不能用
=/<>,必须用IS NULL/IS NOT NULL,你原写法中geo.AreaGeographySID <> NULL永远返回未知值,导致关联完全失效 - 原JOIN的CASE逻辑不符合需求,没有用到
geo.CountryGeographySID作为回退关联值
修改后完整代码
SELECT case when y.Code IN (23,27,30,41,60,61,68) then r.aMapping when y.Code IN (11,12,13,14,15,18,31,33,51,52,53,54,55,58,70,72,76) then r.bMapping when y.Code IN (20,43,44) then r.cMapping When y.Code IN (5,6) then r.dMapping else Concat ('e-',r.eMapping) end as Region INTO #table1 FROM #table0 as y LEFT JOIN [Geography].[dbo].[tGeography] as geo ON y.GeographySID = geo.GeographySID LEFT JOIN [Reference].[dbo].[region_definitions] as r -- 核心逻辑:优先用AreaGeographySID关联,为空则回退到CountryGeographySID ON COALESCE(geo.AreaGeographySID, geo.CountryGeographySID) = r.GeographySID
逻辑说明
COALESCE 函数会返回参数列表中第一个非空的值,刚好匹配你要的关联优先级,所有逻辑都在JOIN阶段完成,SELECT段的原有代码不需要做任何调整。如果需要兼容不支持COALESCE的数据库,也可以将JOIN条件替换为等价的CASE写法:
ON CASE WHEN geo.AreaGeographySID IS NOT NULL THEN geo.AreaGeographySID ELSE geo.CountryGeographySID END = r.GeographySID
内容的提问来源于stack exchange,提问作者Alexander Doran
相关产品推荐
相关产品推荐

