为什么以下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]';
答案 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]$')
没有任何意义。