You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle实现类似SQL Server concat_ws字符串拼接功能及跨库方案咨询

Oracle实现方案
  • 如果你使用的是Oracle 12cR2及更高版本,可以直接用和SQL Server语法完全一致的原生CONCAT_WS函数,自动跳过空值/NULL,代码简洁效率最高:
SELECT CONCAT_WS('-', c1, c2, c3, c4) FROM my_table;
  • 如果你使用的是12cR2以下的低版本Oracle,可以用NVL2+TRIM的组合简化写法,比你目前的CASE写法更短,性能无差异:
SELECT TRIM(BOTH '-' FROM 
    NVL2(c1, '-'||c1, '') || 
    NVL2(c2, '-'||c2, '') || 
    NVL2(c3, '-'||c3, '') || 
    NVL2(c4, '-'||c4, '')
) FROM my_table;

NVL2(参数1, 参数2, 参数3)的逻辑是如果参数1非空则返回参数2,为空则返回参数3,最后用TRIM去掉首尾多余的分隔符即可。

跨SQL Server、Oracle通用实现方案

有两种可选方案,根据你的数据库版本情况选择:

  1. 版本允许的情况下优先用原生CONCAT_WS:Oracle 12cR2+、SQL Server 2017+都原生支持CONCAT_WS,语法完全一致,不需要修改任何代码就可以跨库运行。
  2. 要兼容更低版本的话,可以使用通用的条件判断拼接写法,两个数据库都支持这套语法:
SELECT COALESCE(c1, '') ||
  CASE WHEN c2 IS NOT NULL THEN '-' || c2 ELSE '' END ||
  CASE WHEN c3 IS NOT NULL THEN '-' || c3 ELSE '' END ||
  CASE WHEN c4 IS NOT NULL THEN '-' || c4 ELSE '' END
FROM my_table;

如果使用SQL Server 2019以下版本,只需要把上述代码中的||替换为+,同时开启SET CONCAT_NULL_YIELDS_NULL ON配置即可正常运行。

内容的提问来源于stack exchange,提问作者juergen d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:27:04