Ответ 1
Вы можете использовать регулярное выражение :
SELECT DISTINCT city
FROM station
WHERE city RLIKE '^[aeiouAEIOU].*[aeiouAEIOU]$'
Я хочу запросить список имен CITY
из таблицы STATION(id, city, longitude, latitude)
, у которых есть гласные как их первый, так и последний символы. Результат не может содержать дубликатов.
Для этого я написал запрос типа WHERE NAME LIKE 'a%'
, в котором было 25 условий, каждая гласная для каждой другой гласной, что довольно громоздко. Есть ли лучший способ сделать это?
Вы можете использовать регулярное выражение :
SELECT DISTINCT city
FROM station
WHERE city RLIKE '^[aeiouAEIOU].*[aeiouAEIOU]$'
на сервере 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');
Используйте регулярное выражение.
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]$'
Вы можете подстроить первый и последний символ и сравнить его с ключевым словом IN,
WHERE SUBSTRING(NAME,1,1) IN (a,e,i,o,u) AND SUBSTRING(NAME,-1) IN (a,e,i,o,u)
Вы можете попробовать это
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');
Вы можете попробовать одно простое решение для MySQL:
SELECT DISTINCT city FROM station WHERE city REGEXP "^[aeiou].*";
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'
)
Следующий запрос будет использоваться для 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');
Попробуйте следующее:
select distinct city
from station
where city like '%[aeuio]'and city like '[aeuio]%' Order by City;
Для доступа к MS или серверу MYSQL
SELECT city FROM station
WHERE City LIKE '[aeiou]%'and City LIKE '%[aeiou]';
Вы также можете сделать жесткий код, например, где вы проверяете все возможные варианты, это легко понять начинающим
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'
В 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');
В 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')
Оба из приведенных ниже инструкций работают в 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;
SELECT DISTINCT city
FROM station
WHERE city RLIKE '^[^aeiouAEIOU]'OR city RLIKE'[^aeiouAEIOU]$'
Попробуйте это для начала с гласным
Oracle:
select distinct *field* from *tablename* where SUBSTR(*sort field*,1,1) IN('A','E','I','O','U') Order by *Sort Field*;
Попробуйте следующее:
select distinct city from station where city REGEXP '^[aeiou]' and city REGEXP '[aeiou]$';
Для оракула:
SELECT DISTINCT city
FROM station
WHERE REGEXP_LIKE(city, '^[aeiou].*[aeiou]$','i') ;
Вы можете использовать функции 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')
Попробуйте этот код ниже,
SELECT DISTINCT CITY
FROM STATIOn
WHERE city RLIKE '^[aeiouAEIOU].*.[aeiouAEIOU]$'