使用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;
标签:RETURN,STR,自定义,--,LIST,字符串,SEPARATOR,KEY,ORACLE From: https://www.cnblogs.com/CRobot/p/18489794