Oracle REGEXP_LIKE使用环视或AND忽略顺序

时间:2014-06-24 18:17:33

标签: sql regex oracle

我正在尝试找到与给定字符串中任何位置出现的给定搜索参数列表的匹配项。搜索参数可以是OR或AND。带有REPLACE的REGEXP_LIKE适用于OR(|)但不能用于AND。以下是OR的示例:

select 'match' from dual WHERE REGEXP_LIKE('BCR081', REPLACE ('BCR;081', ';', '|'));
- 作品

select 'match' from dual WHERE REGEXP_LIKE('BCR081', '(' || REPLACE ('BCR;081', ';', ').*?(') || ')');
- 按顺序工作但顺序不重要。

select 'match' from dual WHERE REGEXP_LIKE('BCR081', '(' || REPLACE ('081;BCR', ';', ').*?(') || ')');
- 我需要这个工作。

是否有相当于

的东西
select 'match' from dual WHERE REGEXP_LIKE('BCR081', REPLACE ('BCR;081', ';', '&'));

非常感谢任何帮助。我试过了(向前看?):

select 'match' from dual WHERE REGEXP_LIKE('BCR081','(?=' || REPLACE ('081;BCR', ';', ')(?=') || ')');


注意:以上只是一个例子,我们可以有1-20个搜索参数。也不能使用contains子句,因为它会抛出太多结果错误。

1 个答案:

答案 0 :(得分:0)

我们可以标记搜索字符串,并通过虚拟生成行逐个查找。

with my_data as
(
  select 'BCR081' as str , 'BCR;081' as pattern from dual
),
pattern_table as
(
  select str, regexp_substr(pattern,'[^;]+',1,level) as pattern
  from my_data
  connect by level <= regexp_count(pattern,';') + 1
)
SELECT DECODE(
               COUNT(DECODE(
                           INSTR(a.str,b.pattern),
                           0,
                           null,
                           1)
                    ),
                0,
               'no match',
               'match'
             ) as result
 FROM my_data a, pattern_table b
 WHERE a.str = b.str
 GROUP BY a.str;