You need to enable JavaScript to run this app. Oracle 11g 开发统计逗号分隔字符串去重值数量的自定义函数咨询
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 11g 开发统计逗号分隔字符串去重值数量的自定义函数咨询

Oracle 11g 逗号分隔字符串去重独立值计数函数实现

核心实现适配说明

  • 完全基于Oracle 11g原生语法开发,不依赖12c及以上版本才支持的JSON_TABLE、原生字符串拆分函数
  • 无需创建额外的自定义集合类型,编译后即可直接调用
  • 覆盖常见边界场景:入参空值、连续分隔符、首尾带分隔符、拆分值前后带多余空格

函数逻辑拆解

  • 入参判空:若传入的待拆分字符串为NULL,直接返回0,避免无意义的计算
  • 字符串拆分:通过正则提取配合CONNECT BY分层查询,将整段字符串按指定分隔符拆分为独立值片段
  • 空值过滤:自动剔除拆分过程中产生的无效空字符串片段
  • 去重计数:对所有有效片段执行DISTINCT去重后统计总数量
  • 异常兜底:捕获拆分过程中的运行时异常,避免函数抛出不可控错误

具体实现代码

CREATE OR REPLACE FUNCTION fn_dist_count_values_in_list_arr(
    p_input_str  IN VARCHAR2,
    p_delimiter  IN VARCHAR2 DEFAULT ','
) RETURN NUMBER
IS
    v_result_count NUMBER;
BEGIN
    -- 空入参直接返回0
    IF p_input_str IS NULL THEN
        RETURN 0;
    END IF;

    -- 执行拆分与去重统计
    SELECT COUNT(DISTINCT split_val)
      INTO v_result_count
      FROM (
            SELECT TRIM(
                        REGEXP_SUBSTR(
                            p_input_str,
                            '[^'||p_delimiter||']+',
                            1,
                            LEVEL
                        )
                    ) AS split_val
              FROM DUAL
            CONNECT BY LEVEL <= REGEXP_COUNT(p_input_str, p_delimiter) + 1
            -- 规避CONNECT BY因重复值导致的死循环问题
               AND PRIOR SYS_GUID() IS NOT NULL
           ) all_split_vals
     WHERE split_val IS NOT NULL;

    RETURN v_result_count;
EXCEPTION
    WHEN OTHERS THEN
        RETURN NULL;
END fn_dist_count_values_in_list_arr;
/

效果验证

按照需求给定的测试场景,执行如下调用语句:

SELECT fn_dist_count_values_in_list_arr(
    'Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text,Lorem,Ipsum,is,simply,dummy,text'
) AS distinct_value_count
FROM DUAL;

执行后返回结果为6,与预期完全匹配。

额外兼容说明:函数支持自定义分隔符,例如需要按竖线|拆分时,可传入第二个参数'|',无需修改函数主体逻辑。当输入为,a,,b,a,这类带连续逗号、首尾带逗号的场景时,会自动过滤空值,正确统计独立值为2。

内容的提问来源于stack exchange,提问作者Szabo Gabor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 13:24:05