REGEXP_LIKE与正常(如Oracle中的通配符)之间的区别

时间:2018-09-27 11:37:51

标签: sql oracle

为什么以下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 :(得分:2)

[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元音字符和{{ 1}}个字符。

]

同样,select distinct CITY from STATION where lower(CITY) not like '[aeiou]%' or lower(CITY) not like '%[aeiou]'; 运算符不支持正则表达式;因此此查询要查找的城市不是以7个字符的子字符串开头或以3个字符组成的子字符串,这些子字符串由LIKE字符,[元音字符和{{1} }。

如果您想使用aeiou,则:

]

答案 1 :(得分:1)

这些根本不相似。例如,Oracle无法识别like模式中的字符集。

因此,此表达式:lower(CITY) like '[!aeiou]%'正在寻找诸如以下的城市:

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

但它与仅包含字母的城市名称不匹配,这是我希望的城市名称。

答案 2 :(得分:0)

like '[!aeiou]%'表示在任何字符串之后匹配以[!aeiou]开头的字符串。 像'%[!aeiou]'表示以[!aeiou]结尾的任何字符串。不像意味着不像以'%[!aeiou]'开头或结尾。它们的确不同。 而REGEXP_LIKE(lower(CITY), '^[^aeiou]') or REGEXP_LIKE(lower(CITY), '[^aeiou]$')没有任何意义。