Ограничения regexp_*: ORA-12733: regular expression too long

Нужно при помощи regexp_like проверить большое количество, около 300, условий.

Примерно такой запрос (на db<>fiddle):

select * from t where regexp_like(val,'.*hk.*| .*jj.*|.*we.*.'|...)

Но так, как список слов/выражений в условии большой, то столкиваюсь с ограничениями при выполнения запроса:

ORA-12733: regular expression too long
ORA-01704: string literal too long

Попробовал разбить на части:

[...] and (regexp_like(col,'.*XXX*.') or regexp_like(col,'.*HHHH*.'))

вроде работает, но думаю, что возможно есть более элегантный способ.

Можно ли как то обойти ограничения не разбивая на части шаблон в regexp_like?


Ответы (1 шт):

Автор решения: 0xdb

Если учесть, что поиск идёт по большому колличеству уникальных слов, то лучше отказаться от регулярных выражений и поместить все слова в отдельную таблицу.

Пример для реализации, если границы слова всегда пробел (с данными на db<>fiddle):

create table dict (word varchar2 (32));

select t.*
from t
where exists (
    select 1
    from dict
    where instr (' '||val||' ', ' '||word||' ')>0 
)
→ Ссылка