ORACLE 把字符串拆分为列/结果集

使用REGEXP_SUBSTR

SELECT REGEXP_SUBSTR(key, '[^,]+', 1, ROWNUM) AS VALUE
FROM (
    select '1,3,4,4' as key from dual
) 
CONNECT BY ROWNUM <= LENGTH(key) - LENGTH(REPLACE(key, ',', '')) + 1
;

自定义函数:ODCIVARCHAR2LIST

复制代码
CREATE OR REPLACE FUNCTION GET_LIST_BY_STRING
(
  KEY_STR IN VARCHAR2, -- KEY1,KEY2...KEYN
  SEPARATOR IN VARCHAR2 DEFAULT ',' --  分隔符
) RETURN SYS.ODCIVARCHAR2LIST
AS
  RETURN_LIST SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
  KEY_STR_CLONE VARCHAR2(32767) := KEY_STR; -- 临时字符串,用于处理输入字符串
  SEPARATOR_INDEX PLS_INTEGER := 1; -- 用于跟踪当前分隔符的位置
  ITEM_KEY VARCHAR2(32767); -- 用于存储每次拆分得到的子字符串
BEGIN
  -- 如果输入字符串为空或分隔符为空,则直接返回空列表
  IF KEY_STR IS NULL OR SEPARATOR IS NULL THEN
    RETURN RETURN_LIST;
  END IF;

  -- 循环拆分字符串,直到没有更多的分隔符为止
  LOOP
    -- 查找下一个分隔符的位置
    SELECT INSTR(KEY_STR_CLONE, SEPARATOR, 1, 1) INTO SEPARATOR_INDEX FROM DUAL;
    
    -- 如果找到了分隔符
    IF SEPARATOR_INDEX > 0 THEN
      -- 提取分隔符之前的子字符串
      ITEM_KEY := SUBSTR(KEY_STR_CLONE, 1, SEPARATOR_INDEX - 1);
      -- 将子字符串添加到列表中
      RETURN_LIST.EXTEND;
      RETURN_LIST(RETURN_LIST.COUNT) := ITEM_KEY;
      
      -- 更新临时字符串,去掉已经处理过的部分和分隔符
      KEY_STR_CLONE := SUBSTR(KEY_STR_CLONE, SEPARATOR_INDEX + LENGTH(SEPARATOR));
    ELSE
      -- 如果没有找到分隔符,则将剩余的字符串作为最后一个元素添加到列表中
      RETURN_LIST.EXTEND;
      RETURN_LIST(RETURN_LIST.COUNT) := KEY_STR_CLONE;
      -- 退出循环
      EXIT;
    END IF;
  END LOOP;

  -- 返回拆分后的列表
  RETURN RETURN_LIST;
END;
COMMIT;
复制代码

 

posted @   Robot-Blog  阅读(187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2019-10-21 NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)
2019-10-21 NET 判断是否为回文
点击右上角即可分享
微信分享提示