0

我收到 ORA-12733: regular expression too long 错误,尝试查找某些 id 是否已在数据库中。

regexp_like (','||a.IDs||',',',('||replace(b.IDs,',','|')||'),')

a.ID 和 b.ID 的格式类似于 id=16069,16070,16071,16072,16099,16100。

我会将逗号替换为 | 在 b 所以它会告诉我是否有任何数字匹配。a.IDs 和 b.IDs 的长度可能因不同的查询而异。Oracle regexp_like 限制只有 512。有人知道其他可能的解决方案吗?

4

1 回答 1

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

查看多组条件

于 2017-12-26T14:04:05.980 回答