Oracle SQL不使用CASE合并两列 解决ORA-00909及空值拼接问题
报错原因
- Oracle原生
CONCAT函数仅支持传入2个参数,你之前写的CONCAT(LastName, ‘,’, FirstName)传了3个参数,直接触发ORA-00909: invalid number of arguments错误。 - 第二段拼接语句没有使用任何拼接函数/运算符,直接在SELECT后写三个独立值,会被解析为返回三列数据,无法得到单列的拼接结果;另外你语句里包裹逗号的单引号是中文全角符号,也会触发语法报错。
无CASE语句的实现方案
所有方案均不使用CASE语句,同时满足「字段缺失时不额外添加逗号」的需求:
方案1:高版本Oracle优先用CONCAT_WS(12cR2及以上版本支持)
CONCAT_WS是专门的带分隔符拼接函数,第一个参数为分隔符,后续传入待拼接的字段/值即可,函数会自动跳过NULL值,不会在空值位置生成多余分隔符,写法最简洁:
SELECT CONCAT_WS(',', LastName, FirstName) AS FullName FROM LIST ORDER BY Place;
边界场景验证:
- 两个字段都非空:返回
Chan,Ken格式结果,符合预期 - 仅LastName非空:直接返回LastName值,不会出现开头带逗号的情况
- 仅FirstName非空:直接返回FirstName值,不会出现结尾带逗号的情况
方案2:全版本兼容写法(所有Oracle版本可用)
用Oracle支持的||字符串拼接符拼接两个字段和中间逗号,再用TRIM函数去掉首尾多余的逗号即可,不需要任何条件判断:
SELECT TRIM(',' FROM LastName || ',' || FirstName) AS FullName FROM LIST ORDER BY Place;
该写法逻辑和CONCAT_WS效果完全一致,TRIM只会移除字符串首尾的指定字符,不会影响两个字段中间的逗号,低版本Oracle可以直接用。
注意:写SQL时所有标点符号要使用英文半角格式,不要用中文全角引号、逗号,避免触发不必要的语法错误。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

