如何在Oracle数据库中将字符串拆分为数组?附计算示例
Oracle中拆分字符串并求和的实现方法
针对输入字符串'3/5/7'拆分后求和得到15的需求,以下是几种实用的Oracle实现方案:
1. 通用递归查询(兼容所有Oracle版本)
利用REGEXP_SUBSTR正则提取结合递归层级LEVEL,直接拆分字符串并求和:
SELECT SUM(TO_NUMBER(REGEXP_SUBSTR('3/5/7', '[^/]+', 1, LEVEL))) AS total_sum FROM DUAL CONNECT BY REGEXP_SUBSTR('3/5/7', '[^/]+', 1, LEVEL) IS NOT NULL;
- 逻辑:
REGEXP_SUBSTR按/分隔符依次提取每个子串,递归层级LEVEL控制提取次数,直到提取不到有效内容为止,最后用SUM对提取出的数字求和。
2. Oracle 12c+ 简洁JSON解析方案
如果你的Oracle版本是12c及以上,可以借助JSON_TABLE快速将字符串转成行数据再求和:
SELECT SUM(TO_NUMBER(val)) AS total_sum FROM JSON_TABLE( '["' || REPLACE('3/5/7', '/', '","') || '"]', '$[*]' COLUMNS (val VARCHAR2(100) PATH '$') );
- 逻辑:先通过
REPLACE把原字符串转成合法的JSON数组格式,再用JSON_TABLE将数组元素解析为单独的行,最后求和。
3. PL/SQL中拆分到数组并求和
如果需要将拆分结果存入数组(比如后续要做其他逻辑处理),可以用PL/SQL块实现:
DECLARE TYPE number_array IS TABLE OF NUMBER; v_split_array number_array; v_input_str VARCHAR2(100) := '3/5/7'; v_total NUMBER := 0; BEGIN -- 将拆分后的数字批量存入数组 SELECT TO_NUMBER(REGEXP_SUBSTR(v_input_str, '[^/]+', 1, LEVEL)) BULK COLLECT INTO v_split_array FROM DUAL CONNECT BY REGEXP_SUBSTR(v_input_str, '[^/]+', 1, LEVEL) IS NOT NULL; -- 遍历数组计算总和 FOR idx IN v_split_array.FIRST .. v_split_array.LAST LOOP v_total := v_total + v_split_array(idx); END LOOP; DBMS_OUTPUT.PUT_LINE('拆分后的数组元素总和:' || v_total); END; /
- 逻辑:用
BULK COLLECT将拆分结果一次性存入自定义的数字数组,再通过循环遍历数组累加求和,适合需要对拆分后的数据做复杂处理的场景。
内容的提问来源于stack exchange,提问作者Noname
相关产品推荐
相关产品推荐

