你可以像这样创建一个函数:
CREATE OR REPLACE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER;
CREATE OR REPLACE FUNCTION SplitCSV(LIST IN VARCHAR2, Separator IN VARCHAR2) RETURN NUMBER_TABLE_TYPE IS
OutTable NUMBER_TABLE_TYPE := NUMBER_TABLE_TYPE();
BEGIN
SELECT REGEXP_SUBSTR(LIST, '[^'||Separator||']+', 1, LEVEL)
BULK COLLECT INTO OutTable
FROM dual
CONNECT BY REGEXP_SUBSTR(LIST, '[^'||Separator||']+', 1, LEVEL) IS NOT NULL;
RETURN OutTable;
END;
然后你可以使用它,例如:
WITH t AS (SELECT '100, 200, 300, 400, 500' AS val FROM dual)
SELECT distinct 'true'
FROM t
CROSS JOIN TABLE(SplitCSV(val, ','))
WHERE COLUMN_VALUE BETWEEN 10 and 80;
或者在一个 SELECT 中完成所有操作:
WITH t AS
(SELECT TO_NUMBER(REGEXP_SUBSTR('100, 200, 300, 400, 500', '[^,]+', 1, LEVEL)) AS NUMBERS
FROM dual
CONNECT BY REGEXP_SUBSTR('100, 200, 300, 400, 500', '[^,]+', 1, LEVEL) IS NOT NULL)
SELECT case when count(NUMBERS) > 0 then 'TRUE' else 'FALSE' end
FROM t
WHERE NUMBERS BETWEEN 10 AND 80;