2017-12-26 17 views
0

ORA-12733:データベース内の特定のIDが見つかったときに正規表現が長すぎます。正規表現が長すぎるため、REGEXP_LIKEの代わりに

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

a.IDsとb.IDsは、ID = 16069,16070,16071,16072,16099,16100ようなものの形式です。

私はカンマを| bの中で数字のどれかがマッチするかどうかを教えてくれます。 a.IDとb.IDの長さは、異なるクエリによって異なる場合があります。 Oracleのregexp_likeの制限は512です。他の解決策があれば誰でも知っていますか?

+4

ベストソリューション:テキスト文字列にコンマ区切りリストを格納しないでください。 –

+0

チェックを行うストアド関数を書くことができます – Turo

答えて

0

数字のリストを文字列として保存するのはなぜですか?

いずれにしても、これは1つの解決策です。このようTYPEや関数を作成:

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を見てください

関連する問題