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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:24