разница между REGEXP_LIKE и нормальной, как с подстановочными знаками в оракуле - PullRequest
0 голосов
/ 27 сентября 2018

Почему я получаю разные выходные данные для запросов SQL ниже.Я думал, что все они означают одно и то же, но на самом деле это не так.в чем разница между ними.

select distinct CITY from STATION where REGEXP_LIKE(lower(CITY), '^[^aeiou]') or REGEXP_LIKE(lower(CITY), '[^aeiou]$');

select distinct CITY from STATION where lower(CITY) like '[!aeiou]%' or lower(CITY) like '%[!aeiou]';

select distinct CITY from STATION where lower(CITY) not like '[aeiou]%' or lower(CITY) not like '%[aeiou]';

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

[TL; DR] Ваши LIKE запросы не совпадают ни с одним символом, а с подстановочным знаком, поскольку оператор LIKE не поддерживает регулярные выражения.

select distinct CITY
from   STATION
where  REGEXP_LIKE(lower(CITY), '^[^aeiou]')
or     REGEXP_LIKE(lower(CITY), '[^aeiou]$');

Будетищите любой город, который начинается или заканчивается символом, который не является гласным.

select distinct CITY
from   STATION
where  lower(CITY) like '[!aeiou]%'
or     lower(CITY) like '%[!aeiou]';

Оператор LIKE не поддерживает регулярные выражения;таким образом, этот запрос ищет город, который начинается или заканчивается 8-символьной подстрокой, состоящей из символа [, затем символа !, затем символов гласной aeiou, а затем символа ].

select distinct CITY
from   STATION
where  lower(CITY) not like '[aeiou]%'
or     lower(CITY) not like '%[aeiou]';

Опять же, оператор LIKE не поддерживает регулярные выражения;таким образом, этот запрос ищет город, который не начинается или не заканчивается на 7-символьную подстроку, состоящую из символа [, затем символов aeiou и затем ].

Если вы хотите использовать LIKE, тогда:

select distinct CITY
from   STATION
where  (   lower(CITY) not like 'a%'
       AND lower(CITY) not like 'e%'
       AND lower(CITY) not like 'i%'
       AND lower(CITY) not like 'o%'
       AND lower(CITY) not like 'u%' )
or     (   lower(CITY) not like '%a'
       AND lower(CITY) not like '%e'
       AND lower(CITY) not like '%i'
       AND lower(CITY) not like '%o'
       AND lower(CITY) not like '%u' );
0 голосов
/ 27 сентября 2018

like '[!aeiou]%' означает совпадение строки, начинающейся с [!aeiou] после любой строки.Например, '%[!aeiou]' означает, что любая строка, оканчивающаяся на [!aeiou]. Не похожа, означает, что она не похожа на начало или конец '%[!aeiou]'. Они действительно отличаются.тогда как REGEXP_LIKE(lower(CITY), '^[^aeiou]') or REGEXP_LIKE(lower(CITY), '[^aeiou]$') не имеет никакого смысла.

0 голосов
/ 27 сентября 2018

Они совсем не похожи.Например, Oracle не распознает наборы символов в like шаблонах.

Итак, это выражение: lower(CITY) like '[!aeiou]%' ищет такие города, как:

  • [!aeiou]this is a city name
  • [!aeiou]???

Но оно не будет совпадать с названием города, состоящим только из букв, что, как я ожидаю, будет и именем города.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...