使用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;