вы можете проверить, если длина возвращаемый REGEXP_SUBSTR
больше 0
select *
from (select 'procedure1/loc1/p1' a from dual union
select 'proc2/loc1/p2/c1' from dual union
select 'proc1/loc2/p2/c2' from dual union
select 'procedure3/loc1/p1' from dual union
select 'procedure4/loc3/p1' from dual) t
where length(regexp_substr(t.a, 'procedure4|proc1')) > 0
Alternativly можно использовать REGEXP_LIKE
, который не просто возвращал boolean
и на мой взгляд подошла бы лучше.
select *
from (select 'procedure1/loc1/p1' a from dual union
select 'proc2/loc1/p2/c1' from dual union
select 'proc1/loc2/p2/c2' from dual union
select 'procedure3/loc1/p1' from dual union
select 'procedure4/loc3/p1' from dual) t
where regexp_like(t.a, 'procedure4|proc1')
O/P
proc1/loc2/p2/c2
procedure4/loc3/p1
, если вы хотите, чтобы получить значения из таблицы вы можете создать регулярное выражение динамически с помощью функции listagg
предоставленной оракула. Теперь происходит то, что каждое возможное значение, которое могло бы произойти, объединяется с |
, которое представляет собой or
в регулярном выражении. Благодаря этому вы вы не в потребности в in
, потому что ваше регулярное выражение будет иметь каждое возможное значение разделенного or
select *
from (select 'procedure1/loc1/p1' a from dual union
select 'proc2/loc1/p2/c1' from dual union
select 'proc1/loc2/p2/c2' from dual union
select 'procedure3/loc1/p1' from dual union
select 'procedure4/loc3/p1' from dual) t
where regexp_like(t.a, (select listagg(regexp.b, '|') WITHIN GROUP (ORDER BY regexp.b) regex
from (select 'procedure4' b from dual union
select 'proc1' from dual) regexp))
O/P подзапроса, используемый для регулярных выражений будет proc1|procedure4
, который был бы регулярное выражение, как показано в предыдущем примере
Измените 'PROC1' на 'proc1'.и ваш запрос должен работать. –
@ ArkadiuszŁukasiewicz typo error, его нижняя буква – Moudiz