由于正则表达式太长,因此替代REGEXP_LIKE

时间:2017-12-26 08:48:55

标签: oracle regexp-like

我在尝试查找数据库中是否已存在某些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.任何人都知道其他可能的解决方案吗?

1 个答案:

答案 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, ',')

查看Multiset Conditions