如何使用Oracle PL/SQL拼接非空字符串并指定分隔符
Oracle PL/SQL 非空字符串拼接实现方案
下面提供几种不同的实现方式,适配不同Oracle版本需求:
方法1:使用CONCAT_WS函数(Oracle 12c及以上版本)
CONCAT_WS函数专门用于按指定分隔符拼接字符串,会自动忽略所有空值,用法最简单直接。
DECLARE str1 VARCHAR2(100) := 'A'; str2 VARCHAR2(100) := ''; str3 VARCHAR2(100) := 'B'; str4 VARCHAR2(100) := ''; str5 VARCHAR2(100) := ''; v_separator VARCHAR2(10) := ','; -- 可替换为需要的分隔符,比如示例中的'/' v_result VARCHAR2(500); BEGIN v_result := CONCAT_WS(v_separator, str1, str2, str3, str4, str5); DBMS_OUTPUT.PUT_LINE(v_result); END; /
执行上述代码,输出结果为A,B(如果把分隔符换成/则输出A/B)。
方法2:借助集合与LISTAGG函数(兼容Oracle 11g及以上)
先将所有非空字符串收集到集合中,再用LISTAGG函数完成拼接:
DECLARE TYPE str_table_type IS TABLE OF VARCHAR2(100); v_strs str_table_type := str_table_type(); str1 VARCHAR2(100) := 'A'; str2 VARCHAR2(100) := ''; str3 VARCHAR2(100) := 'B'; str4 VARCHAR2(100) := ''; str5 VARCHAR2(100) := ''; v_separator VARCHAR2(10) := ','; v_result VARCHAR2(500); BEGIN -- 逐个判断并添加非空字符串到集合 IF str1 IS NOT NULL AND str1 <> '' THEN v_strs.EXTEND; v_strs(v_strs.LAST) := str1; END IF; IF str2 IS NOT NULL AND str2 <> '' THEN v_strs.EXTEND; v_strs(v_strs.LAST) := str2; END IF; IF str3 IS NOT NULL AND str3 <> '' THEN v_strs.EXTEND; v_strs(v_strs.LAST) := str3; END IF; IF str4 IS NOT NULL AND str4 <> '' THEN v_strs.EXTEND; v_strs(v_strs.LAST) := str4; END IF; IF str5 IS NOT NULL AND str5 <> '' THEN v_strs.EXTEND; v_strs(v_strs.LAST) := str5; END IF; -- 拼接集合中的字符串 SELECT LISTAGG(column_value, v_separator) WITHIN GROUP (ORDER BY ROWNUM) INTO v_result FROM TABLE(v_strs); DBMS_OUTPUT.PUT_LINE(v_result); END; /
方法3:手动拼接逻辑(兼容所有Oracle版本)
如果使用的是更低版本的Oracle,无法使用上述函数,可以通过手动判断实现:
DECLARE str1 VARCHAR2(100) := 'A'; str2 VARCHAR2(100) := ''; str3 VARCHAR2(100) := 'B'; str4 VARCHAR2(100) := ''; str5 VARCHAR2(100) := ''; v_separator VARCHAR2(10) := ','; v_result VARCHAR2(500) := ''; BEGIN -- 逐个拼接非空字符串,处理分隔符位置 IF str1 IS NOT NULL AND str1 <> '' THEN v_result := str1; END IF; IF str2 IS NOT NULL AND str2 <> '' THEN v_result := CASE WHEN v_result = '' THEN str2 ELSE v_result || v_separator || str2 END; END IF; IF str3 IS NOT NULL AND str3 <> '' THEN v_result := CASE WHEN v_result = '' THEN str3 ELSE v_result || v_separator || str3 END; END IF; IF str4 IS NOT NULL AND str4 <> '' THEN v_result := CASE WHEN v_result = '' THEN str4 ELSE v_result || v_separator || str4 END; END IF; IF str5 IS NOT NULL AND str5 <> '' THEN v_result := CASE WHEN v_result = '' THEN str5 ELSE v_result || v_separator || str5 END; END IF; DBMS_OUTPUT.PUT_LINE(v_result); END; /
内容的提问来源于stack exchange,提问作者user2280352
相关产品推荐
相关产品推荐

