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

MySQL查询错误分析:筛选非元音首尾不重复城市名语句排查

原MySQL查询语句的问题及原因分析

1. 核心逻辑语法错误

原语句的WHERE子句写法完全不符合需求逻辑:(SUBSTR(CITY,1,1) AND SUBSTR(CITY,-1,1)) NOT IN ("a","e","i","o","u")。这里的AND是逻辑运算符,它会将前后两个SUBSTR返回的字符串转换为布尔值(MySQL中所有非空字符串都会被视为TRUE),计算出TRUE AND TRUE的结果为TRUE后,再判断这个布尔值是否不在元音列表中。

但MySQL会把布尔值TRUE转换为数值1,而给定的列表是字符串类型的元音,1自然不在这个列表里,导致所有非空的城市名都会被选中——不管它是否以元音开头或结尾,这完全违背了需求。

比如城市名apple,开头和结尾都是元音a,按照需求应该被排除,但原语句会将它选中:两个SUBSTR返回a(非空→TRUE),AND运算后得到TRUE,TRUE NOT IN (...)等价于1 NOT IN ('a','e','i','o','u'),结果为TRUE,所以这条记录会被保留。

2. 大小写未处理的潜在问题

原语句只针对小写元音进行判断,但如果城市名存在大写开头或结尾的情况(比如Orlando开头是O、Atlanta开头是A),原语句无法过滤这些以大写元音开头/结尾的城市,因为"O"、"A"不在给定的小写元音列表中,导致不符合需求的记录被保留。

正确的实现语句

要满足“不以元音开头且不以元音结尾,结果去重”的需求,需要分别判断开头字符和结尾字符都不在元音集合中,正确写法如下:

写法1:同时包含大小写元音

SELECT DISTINCT CITY 
FROM STATION 
WHERE SUBSTR(CITY, 1, 1) NOT IN ('a','e','i','o','u','A','E','I','O','U')
  AND SUBSTR(CITY, -1, 1) NOT IN ('a','e','i','o','u','A','E','I','O','U');

写法2:统一转小写简化判断

SELECT DISTINCT CITY 
FROM STATION 
WHERE LOWER(SUBSTR(CITY, 1, 1)) NOT IN ('a','e','i','o','u')
  AND LOWER(SUBSTR(CITY, -1, 1)) NOT IN ('a','e','i','o','u');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:25:20