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通用实现方案
有两种可选方案,根据你的数据库版本情况选择:
- 版本允许的情况下优先用原生
CONCAT_WS:Oracle 12cR2+、SQL Server 2017+都原生支持CONCAT_WS,语法完全一致,不需要修改任何代码就可以跨库运行。 - 要兼容更低版本的话,可以使用通用的条件判断拼接写法,两个数据库都支持这套语法:
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
相关产品推荐
相关产品推荐

