SQL-запрос, чтобы проверить, начинается ли имя и заканчивается гласным

Я хочу запросить список имен CITY из таблицы STATION(id, city, longitude, latitude), у которых есть гласные как их первый, так и последний символы. Результат не может содержать дубликатов.

Для этого я написал запрос типа WHERE NAME LIKE 'a%', в котором было 25 условий, каждая гласная для каждой другой гласной, что довольно громоздко. Есть ли лучший способ сделать это?

Ответ 1

Вы можете использовать регулярное выражение :

SELECT DISTINCT city
FROM   station
WHERE  city RLIKE '^[aeiouAEIOU].*[aeiouAEIOU]$'

Ответ 2

на сервере Microsoft SQL вы можете добиться этого с помощью следующего запроса:

SELECT distinct City FROM STATION WHERE City LIKE '[AEIOU]%[AEIOU]'

Или

SELECT distinct City FROM STATION WHERE City LIKE '[A,E,I,O,U]%[A,E,I,O,U]'

Обновление --Added Oracle Query

--Way 1 --It должен работать во всех версиях Oracle

SELECT DISTINCT CITY FROM STATION WHERE REGEXP_LIKE(LOWER(CITY), '^[aeiou]') and  REGEXP_LIKE(LOWER(CITY), '[aeiou]$');

--Way 2 --It может не работать в некоторых версиях Oracle

SELECT DISTINCT CITY FROM STATION WHERE REGEXP_LIKE(LOWER(CITY), '^[aeiou].*[aeiou]');

--Way 3 --It может не работать в некоторых версиях Oracle

SELECT DISTINCT CITY FROM STATION WHERE REGEXP_LIKE(CITY, '^[aeiou].*[aeiou]', 'i');

Ответ 3

Используйте регулярное выражение.

WHERE name REGEXP '^[aeiou].*[aeiou]$'

^ и $ привязать соответствие к началу и концу значения.

В моем тесте это не будет использовать индекс в столбце name, поэтому ему нужно будет выполнить полное сканирование, как и

WHERE name LIKE 'a%a' OR name LIKE 'a%e' ...

Я думаю, чтобы он использовал индекс, который вам нужен, чтобы использовать объединение запросов, каждое из которых проверяет первую букву.

SELECT * FROM table
WHERE name LIKE 'a%' AND name REGEXP '[aeiou]$'
UNION
SELECT * FROM table
WHERE name LIKE 'e%' AND name REGEXP '[aeiou]$'
UNION
SELECT * FROM table
WHERE name LIKE 'i%' AND name REGEXP '[aeiou]$'
UNION
SELECT * FROM table
WHERE name LIKE 'o%' AND name REGEXP '[aeiou]$'
UNION
SELECT * FROM table
WHERE name LIKE 'u%' AND name REGEXP '[aeiou]$'

Ответ 4

Вы можете подстроить первый и последний символ и сравнить его с ключевым словом IN,

WHERE SUBSTRING(NAME,1,1) IN (a,e,i,o,u) AND SUBSTRING(NAME,-1) IN (a,e,i,o,u) 

Ответ 5

Вы можете попробовать это

    select city
    from station where SUBSTRING(city,1,1) in ('A','E','I','O','U') and 
    SUBSTRING(city,-1,1) in ('A','E','I','O','U');

Ответ 6

Вы можете попробовать одно простое решение для MySQL:

SELECT DISTINCT city FROM station WHERE city REGEXP "^[aeiou].*";

Ответ 7

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 LIKE '%a' 
    OR CITY LIKE '%e'
    OR CITY LIKE '%i'
    OR CITY LIKE '%o'
    OR CITY LIKE '%u'
)

Ответ 8

Следующий запрос будет использоваться для Oreal DB:

select distinct(city) from station where upper(substr(city, 1,1)) in ('A','E','I','O','U') and upper(substr(city, length(city),1)) in ('A','E','I','O','U');

Ответ 9

Попробуйте следующее:

select distinct city 
from station 
where city like '%[aeuio]'and city like '[aeuio]%' Order by City;

Ответ 10

Для доступа к MS или серверу MYSQL

SELECT city FROM station
WHERE City LIKE '[aeiou]%'and City LIKE '%[aeiou]';

Ответ 11

Вы также можете сделать жесткий код, например, где вы проверяете все возможные варианты, это легко понять начинающим

SELECT DISTINCT CITY 
FROM STATION
WHERE CITY LIKE 'A%A' OR CITY LIKE 'E%E' OR CITY LIKE 'I%I' OR CITY LIKE 'O%O' OR
CITY LIKE 'U%U' OR CITY LIKE 'A%E' OR CITY LIKE 'A%I' OR CITY LIKE 'A%O' OR 
CITY LIKE 'A%U' OR CITY LIKE 'E%A' OR CITY LIKE 'E%I' OR CITY LIKE 'E%O' OR 
CITY LIKE 'E%U' OR CITY LIKE 'I%A' OR CITY LIKE 'I%E' OR CITY LIKE 'I%O' OR 
CITY LIKE 'I%U' OR CITY LIKE 'O%A' OR CITY LIKE 'O%E' OR CITY LIKE 'O%I' OR 
CITY LIKE 'O%U' OR CITY LIKE 'U%A' OR CITY LIKE 'U%E' OR CITY LIKE 'U%I' OR 
CITY LIKE 'U%O'

Ответ 12

В Oracle:

SELECT DISTINCT city 
FROM station 
WHERE SUBSTR(lower(CITY),1,1) IN ('a','e','i','o','u') AND SUBSTR(lower(CITY),-1) IN ('a','e','i','o','u');

Ответ 13

В MSSQL это может быть так:

select distinct city from station 
where
right(city,1) in ('a', 'e', 'i', 'o','u') and left(city,1) in ('a', 'e', 'i', 'o','u') 

Ответ 14

Оба из приведенных ниже инструкций работают в Microsoft SQL SERVER

SELECT DISTINCT
    city
FROM
    station
WHERE
    SUBSTRING(lower(CITY), 1, 1) IN ('a', 'e', 'i', 'o', 'u')
    AND SUBSTRING(lower(CITY), LEN(CITY), 1) IN ('a', 'e', 'i', 'o', 'u');

SELECT DISTINCT
    City
FROM
    Station
WHERE
    City LIKE '[A, E, O, U, I]%[A, E, O, U, I]'
ORDER BY
    City;

Ответ 15

SELECT DISTINCT city
FROM   station
WHERE  city RLIKE '^[^aeiouAEIOU]'OR city RLIKE'[^aeiouAEIOU]$'

Ответ 16

Попробуйте это для начала с гласным

Oracle:

select distinct *field* from *tablename* where SUBSTR(*sort field*,1,1) IN('A','E','I','O','U') Order by *Sort Field*;

Ответ 17

Попробуйте следующее:

select distinct city from station where city REGEXP '^[aeiou]' and city REGEXP '[aeiou]$';

Ответ 18

Для оракула:

SELECT DISTINCT city
FROM   station
WHERE REGEXP_LIKE(city, '^[aeiou].*[aeiou]$','i') ;

Ответ 19

Вы можете использовать функции LEFT() и RIGHT(). Left(CITY,1) получит первый символ CITY слева. Right(CITY,1) получит первый символ CITY справа (последний символ CITY).

DISTINCT используется для удаления дубликатов. Чтобы сделать сравнение без учета регистра, мы будем использовать функцию LOWER().

SELECT DISTINCT CITY
FROM STATION
WHERE LOWER(LEFT(CITY,1)) IN ('a', 'e', 'i', 'o', 'u') AND
      LOWER(RIGHT(CITY,1)) IN ('a', 'e', 'i', 'o', 'u')

Ответ 20

Попробуйте этот код ниже,

SELECT DISTINCT CITY
FROM   STATIOn
WHERE  city RLIKE '^[aeiouAEIOU].*.[aeiouAEIOU]$'