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

