You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:47:52