oracle regexp_like: использование Perl regexp для эквивалента оператора AND - PullRequest
0 голосов
/ 28 февраля 2020

Есть ли эквивалент оператора AND при написании регулярного выражения в Oracle REGEX_LIKE? Я пытался выбрать все случаи, когда все три слова должны содержаться в строке. В приведенном ниже примере я хочу сопоставить все случаи, когда все три слова , small & leather & goods должны быть включены в строка. Я перепробовал много онлайн-тестеров регулярных выражений, и синтаксис регулярных выражений делает именно то, что мне нужно, но когда я пытаюсь использовать синтаксис в выражении REGEXP_LIKE, я получаю ноль совпадений

regexp_like(GLOBAL_CATEGORY,'(?=.*small)(?=.*leather)(?=.*goods)^.*$','i') 

пример тестера regex, который выполняет то, что я ищу: regexr.com / 4vc1s

Men/Outerwear/Leather/Sale **(NO MATCH)**
Men > Accessories > Bags & Leather Goods > Small Leather Goods **(YES MATCH)**
Men > Accessories > Bags & Leather Goods > Bags **(NO MATCH)**
Men > Accessories > Bags & Leather Goods > Small Leather Goods **(YES MATCH)**
Men/Outerwear/Leather/Sale **(NO MATCH)**
Men/Small_Leather_Goods/Sale **(YES MATCH)**
Men/Outerwear/Leather **(NO MATCH)**
Men/Small_Leather_Goods **(YES MATCH)**
men>accessories>small>leather>goods **(YES MATCH)**

Ответы [ 2 ]

4 голосов
/ 29 февраля 2020

Если вы не настаиваете на регулярных выражениях, тогда простой instr делает свою работу:

SQL> with test (col) as (
  2  select 'Men/Outerwear/Leather/Sale **(NO MATCH)**'                                      from dual union all
  3  select 'Men > Accessories > Bags & Leather Goods > Small Leather Goods **(YES MATCH)**' from dual union all
  4  select 'Men > Accessories > Bags & Leather Goods > Bags **(NO MATCH)**'                 from dual union all
  5  select 'Men > Accessories > Bags & Leather Goods > Small Leather Goods **(YES MATCH)**' from dual union all
  6  select 'Men/Outerwear/Leather/Sale **(NO MATCH)**'                                      from dual union all
  7  select 'Men/Small_Leather_Goods/Sale **(YES MATCH)**'                                   from dual union all
  8  select 'Men/Outerwear/Leather **(NO MATCH)**'                                           from dual union all
  9  select 'Men/Small_Leather_Goods **(YES MATCH)**'                                        from dual union all
 10  select 'men>accessories>small>leather>goods **(YES MATCH)**'                            from dual
 11  )
 12  select * from test
 13  where instr(lower(col), 'small')   > 0
 14    and instr(lower(col), 'leather') > 0
 15    and instr(lower(col), 'goods')   > 0;

COL
------------------------------------------------------------------------------
Men > Accessories > Bags & Leather Goods > Small Leather Goods **(YES MATCH)**
Men > Accessories > Bags & Leather Goods > Small Leather Goods **(YES MATCH)**
Men/Small_Leather_Goods/Sale **(YES MATCH)**
Men/Small_Leather_Goods **(YES MATCH)**
men>accessories>small>leather>goods **(YES MATCH)**

SQL>

(да, я знаю, (YES/NO MATCH) не является частью строки, но я был ленивым чтобы удалить его.)

2 голосов
/ 29 февраля 2020

Предполагая, что вы хотите слова мелкий, кожа и товары в таком порядке, попробуйте:

regexp_like(GLOBAL_CATEGORY,'*small.*.leather.*goods*', 'i')

. соответствует любому символу
* соответствует нулю или большему количеству вхождений предыдущего подвыражения
i - это шаблон совпадения, который указывает регистронезависимое сопоставление

Демо здесь

...