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

PostgreSQL中能否仅使用LIKE或ILIKE关键字查询不以元音(或指定字符集)开头的字符串?

仅用PostgreSQL的LIKE/ILIKE实现不以元音开头的字符串查询

首先直接给结论:可以实现,但不能用你尝试的方括号字符集语法,只能通过逐个排除的方式。

你遇到的问题根源在于:PostgreSQL的LIKE/ILIKE不支持正则表达式里的方括号字符类匹配——方括号在LIKE语法里就是普通字符,不是通配符。所以你写的NOT ILIKE '[aeiou]%',实际上是在筛选不是以字符串"[aeiou]"开头的名字,而不是不以元音开头。这就难怪Aaron、Adam这类名字会被返回了,它们的开头显然不是"[aeiou]"嘛。

如果必须只依赖LIKE/ILIKE,唯一的办法就是把每个元音开头的情况单独排除,用AND连接多个条件:

SELECT first_name FROM Customer 
WHERE first_name NOT ILIKE 'a%'
  AND first_name NOT ILIKE 'e%'
  AND first_name NOT ILIKE 'i%'
  AND first_name NOT ILIKE 'o%'
  AND first_name NOT ILIKE 'u%'
ORDER BY first_name;

这个写法确实能达到你的需求,而且完全符合只用LIKE/ILIKE的要求,但它的缺点也很明显:如果要排除的字符集比较大(比如包含大小写、特殊字符),条件会变得非常冗长,而且性能上也不如正则表达式高效。

补充一下:你单独用NOT ILIKE 'a%'能生效,是因为这个条件明确匹配开头不是字母a的字符串,这属于LIKE支持的单字符前缀匹配,和多字符集合匹配是两回事。

当然,如果你不限制必须只用LIKE/ILIKE,PostgreSQL里用正则表达式会更简洁,比如first_name !~* '^[aeiou]',不过这就不符合你提出的“仅依赖LIKE/ILIKE”的要求了。

内容的提问来源于stack exchange,提问作者roschach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:28:11