Oracle中NOT LIKE语句异常:SQL Server可行的筛选语句结果不符
为什么你的SQL在Oracle里不生效?
嘿,这个问题我碰到过好多次!核心原因是SQL Server和Oracle对LIKE操作符的模式匹配规则完全不一样,尤其是你用的[AEIOUaeiou]这种字符组语法,Oracle根本不支持~
先说说SQL Server能正常工作的原因
SQL Server的LIKE操作符支持用[]来定义「字符组」,比如[AEIOUaeiou]%的意思是:匹配以任意一个元音字母(大小写都算)开头的字符串。所以你的NOT LIKE就能正确筛选出不以元音开头的城市,逻辑完全没问题。
再说说Oracle为啥返回所有城市
Oracle的LIKE操作符只认两个基础通配符:
%:匹配任意长度的任意字符_:匹配单个任意字符
它完全不支持[]这种字符组语法!所以你写的CITY NOT LIKE '[AEIOUaeiou]%'在Oracle眼里,是要排除那些以[AEIOUaeiou]这个 literal 字符串(就是带方括号的那串)开头的城市——而你的STATION表显然没有这样的城市,所以自然就返回了所有数据。
给你两种Oracle的解决方案
方案1:用正则表达式函数REGEXP_LIKE(推荐)
Oracle支持REGEXP_LIKE来处理正则匹配,这和你原来的逻辑最贴合:
SELECT DISTINCT CITY FROM STATION WHERE NOT REGEXP_LIKE(CITY, '^[AEIOUaeiou]') ORDER BY CITY ASC;
如果想简化大小写的写法,可以加个'i'参数忽略大小写:
SELECT DISTINCT CITY FROM STATION WHERE NOT REGEXP_LIKE(CITY, '^[aeiou]', 'i') ORDER BY CITY ASC;
这里^表示字符串的开头,[aeiou]是元音字符组,'i'表示不区分大小写,完美实现你的需求。
方案2:用多个LIKE组合(不用正则的话)
如果不想用正则,也可以把每个元音的情况单独列出来,用AND连接:
SELECT DISTINCT CITY FROM STATION WHERE CITY NOT LIKE 'A%' AND CITY NOT LIKE 'E%' AND CITY NOT LIKE 'I%' AND CITY NOT LIKE 'O%' AND CITY NOT LIKE 'U%' AND CITY NOT LIKE 'a%' AND CITY NOT LIKE 'e%' AND CITY NOT LIKE 'i%' AND CITY NOT LIKE 'o%' AND CITY NOT LIKE 'u%' ORDER BY CITY ASC;
这种写法虽然能实现功能,但比较繁琐,不如正则简洁,适合不能用正则的场景。
内容的提问来源于stack exchange,提问作者samuraivader
相关产品推荐
相关产品推荐

