如何用IN或ANY运算符替换多OR语句查询不重复元音结尾城市
解决方案:用IN或ANY实现以元音结尾的不重复城市查询
没问题,我帮你把原查询改写成更简洁的IN或ANY版本,两种写法都能达到和你原有语句相同的效果:
方法1:使用IN运算符
这种写法最简洁,通过提取城市名的最后一个字符,直接判断它是否在元音集合中:
SELECT DISTINCT City FROM Station WHERE RIGHT(City, 1) IN ('a', 'e', 'i', 'o', 'u');
说明:
RIGHT(City, 1)函数用于截取城市名的最后一个字符(不同数据库的等价函数:MySQL、PostgreSQL、SQL Server都支持RIGHT(),Oracle可以用SUBSTR(City, -1))。- 如果你的数据库对大小写敏感(比如城市名可能以大写元音结尾,如"Phoenix"),可以把截取的字符转成小写来兼容:
SELECT DISTINCT City FROM Station WHERE LOWER(RIGHT(City, 1)) IN ('a', 'e', 'i', 'o', 'u');
方法2:使用ANY运算符
ANY需要配合子查询来构造元音列表,适合需要动态生成条件的场景:
SELECT DISTINCT City FROM Station WHERE RIGHT(City, 1) = ANY ( SELECT v FROM (VALUES ('a'), ('e'), ('i'), ('o'), ('u')) AS vowels(v) );
说明:
- 这里我们先通过
VALUES子句构造了一个包含所有元音的临时表vowels,然后用= ANY判断城市名的最后一个字符是否等于临时表中的任意一个元音值。 - 同样,若需要兼容大小写,加上
LOWER()即可:SELECT DISTINCT City FROM Station WHERE LOWER(RIGHT(City, 1)) = ANY ( SELECT v FROM (VALUES ('a'), ('e'), ('i'), ('o'), ('u')) AS vowels(v) );
两种写法都能替代你原来的多个LIKE OR的逻辑,代码更简洁易维护,尤其是当需要调整元音列表时,只需要修改集合或临时表的内容即可。
内容的提问来源于stack exchange,提问作者ToluwalopeB
相关产品推荐
相关产品推荐

