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
相关产品推荐
相关产品推荐

