我在尝试查找数据库中是否已存在某些ID时,收到ORA-12733:正则表达式错误。
regexp_like (','||a.IDs||',',',('||replace(b.IDs,',','|')||'),')
a.IDs和b.IDs的格式类似于id = 16069,16070,16071,16072,16099,16100。
我将用|替换逗号在b中它会告诉我是否有任何数字匹配。 a.IDs和b.IDs的长度可能因不同的查询而异。 Oracle regexp_like限制只有512.任何人都知道其他可能的解决方案吗?
答案 0 :(得分:0)
为什么在地球上存储数字列表为字符串?
无论如何,一个可能的解决方案就是这个。像这样创建TYPE和FUNCTION:
CREATE OR REPLACE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER;
CREATE OR REPLACE FUNCTION SplitArray(LIST IN VARCHAR2, Separator IN VARCHAR2) RETURN NUMBER_TABLE_TYPE IS
OutTable NUMBER_TABLE_TYPE;
BEGIN
IF LIST IS NULL THEN
RETURN NULL;
ELSE
SELECT REGEXP_SUBSTR(LIST, '[^'||Separator||']+', 1, LEVEL)
BULK COLLECT INTO OutTable
FROM dual
CONNECT BY REGEXP_SUBSTR(LIST, '[^'||Separator||']+', 1, LEVEL) IS NOT NULL;
END IF;
IF OutTable.COUNT > 0 THEN
RETURN OutTable;
ELSE
RETURN NULL;
END IF;
END SplitArray;
然后您查询单个数字:
WHERE 16071 MEMBER OF SplitArray(a.IDs, ',')
或多个数字:
WHERE SplitArray(b.IDs, ',') SUBMULTISET OF SplitArray(a.IDs, ',')