所需问题的输出不正确

时间:2019-06-03 05:10:54

标签: mysql sql string

目的是查询所有CITIES,并且其开头和结尾字母均为元音。我尝试了下面的似乎无效的代码。您能解释为什么它不起作用吗?有更好的方法吗?

我试图首先获取以元音结尾的城市,然后尝试将其用作选择以元音开头的城市的子查询,如下所示:

我已经尝试实现此代码:

SELECT DISTINCT(CITY)
FROM STATION
WHERE CITY LIKE 'a%'
  OR CITY LIKE 'e%'
  OR CITY LIKE 'i%'
  OR CITY LIKE 'o%'
  OR CITY LIKE 'u%'
AND CITY IN (
  SELECT DISTINCT(CITY)
  FROM STATION
  WHERE CITY LIKE '%a'
    OR CITY LIKE '%e'
    OR CITY LIKE '%i'
    OR CITY LIKE '%o'
    OR CITY LIKE '%u'
);

所需的输出如下:

Oslo
Upperco
Amazonia
...
...
...

我得到这些作为输出,以及那些没有以元音结尾的城市,如:

Arlington 
Albany 
Upperco 
Aguanga 
Odin 
East China 
Algonac 
Onaway 
Irvington 
Arrowsmith 
Oakfield 
Elkton 
East Irvine 
Amo 
...
...
...

1 个答案:

答案 0 :(得分:0)

更好的方法可能是使用REGEXP

SELECT DISTINCT CITY
FROM STATION
WHERE CITY REGEXP '^[aeiou].*[aeiou]$';

请注意,REGEXP不区分大小写,因此我们只需要在正则表达式的单个情况下使用[aeiou]

您当前的查询实际上在逻辑上是正确的,但是由于对ANDOR的使用/理解不正确,因此您不会得到想要的行为。 AND的优先级比OR高,因此查询中缺少括号。试试这个版本:

SELECT DISTINCT CITY
FROM STATION
WHERE
    (LOWER(CITY) LIKE 'a%' OR
     LOWER(CITY) LIKE 'e%' OR
     LOWER(CITY) LIKE 'i%' OR
     LOWER(CITY) LIKE 'o%' OR
     LOWER(CITY) LIKE 'u%') AND
    (LOWER(CITY) LIKE '%a' OR
     LOWER(CITY) LIKE '%e' OR
     LOWER(CITY) LIKE '%i' OR
     LOWER(CITY) LIKE '%o' OR
     LOWER(CITY) LIKE '%u') ;