HackerRank Weather Observation Station 11 SQL查询异常问题咨询
问题原因
- 运算符使用错误:
IN/NOT IN仅支持精确值匹配,无法识别%通配符的模糊匹配规则。你写的CITY NOT IN ('%a','%e','%i','%o','%u')实际是判断城市名是否完全等于%a这类带百分号的字符串,几乎不会命中任何数据,导致该条件恒为真,配合OR逻辑会让整个筛选条件永久生效,返回全部城市。 - 逻辑优先级隐患:即使替换为正确的模糊匹配运算符,
OR的运算优先级低于AND,如果不加括号区分条件块,也会出现逻辑判断错误。
修正方案
有两种主流实现方式,均符合题目要求:
方案1:直接匹配题目逻辑
用NOT LIKE替换NOT IN实现模糊匹配,用括号区分两个条件块避免优先级问题:
SELECT DISTINCT CITY FROM STATION WHERE (CITY NOT LIKE 'a%' AND CITY NOT LIKE 'e%' AND CITY NOT LIKE 'i%' AND CITY NOT LIKE 'o%' AND CITY NOT LIKE 'u%') OR (CITY NOT LIKE '%a' AND CITY NOT LIKE '%e' AND CITY NOT LIKE '%i' AND CITY NOT LIKE '%o' AND CITY NOT LIKE '%u');
方案2:逻辑简化版
根据德摩根定律,「要么不以元音开头、要么不以元音结尾」等价于「排除同时以元音开头且以元音结尾的城市」,写法更简洁,执行效率更高:
SELECT DISTINCT CITY FROM STATION WHERE NOT ( (CITY LIKE 'a%' OR CITY LIKE 'e%' OR CITY LIKE 'i%' OR CITY LIKE 'o%' OR CITY LIKE 'u%') AND (CITY LIKE '%a' OR CITY LIKE '%e' OR CITY LIKE '%i' OR CITY LIKE '%o' OR CITY LIKE '%u') );
如果使用支持正则匹配的数据库(如MySQL),还可以用正则进一步简化写法:
SELECT DISTINCT CITY FROM STATION WHERE CITY NOT REGEXP '^[aeiou].*[aeiou]$';
内容的提问来源于stack exchange,提问作者Ismriti Gupta
相关产品推荐
相关产品推荐

