SQL中如何带逻辑条件拼接两列并过滤'.'占位符
实现方法
原有方案的问题定位
之前直接硬拼接Col2和Col3会出问题,本质是没把代表空值的'.'占位符过滤掉,直接把两个字符串硬连,才会出现'A.'、'.B'、'..'这类多余的结果。
你之前写的语句已经覆盖了「Col2有有效值就取Col2、Col2无效就取Col3」的核心逻辑,但少了最后一层兜底:当Col2和Col3全是'.'的时候,经过NULLIF(xxx, '.')转换后两个值都是NULL,COALESCE没有可返回的非NULL值,就会输出NULL,和预期要求的'.'不匹配。
方案1:原有逻辑最小修改
直接在COALESCE的参数末尾加一个兜底值'.'就行,不需要改其他逻辑:
SELECT Col1, COALESCE(NULLIF(Col2,'.'), NULLIF(Col3,'.'), '.') AS `Col2+3` FROM db.table;
逐行校验输出结果:
- 第一行Col2='A':NULLIF转完直接拿到'A',输出'A'
- 第二行Col2='.'、Col3='B':跳过Col2转的NULL,拿到Col3的'B',输出'B'
- 第三行Col2='.'、Col3='.':两个值都转成NULL后,匹配兜底的'.',输出'.'
完全匹配预期的拼接规则,不会出现硬拼接带来的多余符号问题。
方案2:逻辑更直白的分支写法
如果觉得COALESCE加NULLIF的组合不好记,可以直接用CASE判断实现完全一样的效果,每一步规则都写得明明白白:
SELECT Col1, CASE -- Col2不是占位符'.',直接取Col2的值 WHEN Col2 <> '.' THEN Col2 -- Col2是占位符,就看Col3是不是有效,有效就取Col3 WHEN Col3 <> '.' THEN Col3 -- 两个都是占位符,就返回'.' ELSE '.' END AS `Col2+3` FROM db.table;
这个写法的输出结果和上面的方案1完全一致,后续维护的时候不用翻规则回忆组合函数的逻辑。
内容的提问来源于stack exchange,提问作者Cheknov
相关产品推荐
相关产品推荐

