如何使符合条件的SQL记录生成两条含不同city_code的重复结果
解决SQL中UAE城市拆分两条记录的需求
问题分析
原SQL的CASE WHEN逻辑存在两个核心问题:一是CASE语句只能返回单个值,无法实现单条记录拆分为两条的需求;二是条件顺序错误——T2.city = 'uae'属于T2.city IS NOT NULL的子集,原逻辑中第二个条件永远不会被触发。要实现需求,需要将数据拆分为两个分支处理后合并:
- 对
T2.city = 'uae'的记录,通过交叉连接包含'U'和'E'的临时集合生成两条记录 - 对其他记录,按正常逻辑返回
city_code
实现代码
-- 处理UAE场景:生成两条仅city_code不同的重复记录 SELECT T1.name, T1.adrs, T1.state, code.city_code FROM DB.TABLE1 T1 LEFT JOIN DB.TABLE2 T2 ON T1.SK = T2.SK CROSS JOIN (SELECT 'U' AS city_code UNION ALL SELECT 'E') code WHERE T2.city = 'uae' UNION ALL -- 处理非UAE的正常场景 SELECT T1.name, T1.adrs, T1.state, CASE WHEN T2.city IS NOT NULL THEN T2.city ELSE T1.state -- 原逻辑中T2.state可能为NULL(LEFT JOIN场景下T2无匹配时),建议根据业务实际调整为T1.state或默认值 END AS city_code FROM DB.TABLE1 T1 LEFT JOIN DB.TABLE2 T2 ON T1.SK = T2.SK WHERE T2.city != 'uae' OR T2.city IS NULL;
关键说明
- 使用
UNION ALL而非UNION,避免重复数据校验,提升查询性能 - 临时集合
(SELECT 'U' AS city_code UNION ALL SELECT 'E')用于为每条UAE记录生成两个目标city_code值 - 修正了原逻辑的条件顺序问题,确保分支逻辑正确触发
- 针对
LEFT JOIN后T2无匹配的场景,将原逻辑的else T2.state调整为else T1.state(可根据实际业务需求修改),避免返回NULL值
内容的提问来源于stack exchange,提问作者user23424529
相关产品推荐
相关产品推荐

