用于检查名称是不是以元音开头和结尾的 SQL 查询
Posted
技术标签:
【中文标题】用于检查名称是不是以元音开头和结尾的 SQL 查询【英文标题】:SQL query to check if a name begins and ends with a vowel用于检查名称是否以元音开头和结尾的 SQL 查询 【发布时间】:2016-08-06 06:33:54 【问题描述】:我想从STATION(id, city, longitude, latitude)
表中查询CITY
名称列表,这些名称的第一个和最后一个字符都是元音。结果不能包含重复项。
为此,我编写了一个类似WHERE NAME LIKE 'a%'
的查询,它有 25 个条件,每个元音对应每个其他元音,这非常笨拙。有更好的方法吗?
【问题讨论】:
思路:正则表达式或left()
/right()
.
即使问题本身很有趣,您也应该更改表和字段名称,以减少来自hackerrank.com/challenges/weather-observation-station-8/problem 的“天气观测站 8”问题的明确性,而不是仅仅复制问题.
【参考方案1】:
你可以使用regular expression:
SELECT DISTINCT city
FROM station
WHERE city RLIKE '^[aeiouAEIOU].*[aeiouAEIOU]$'
【讨论】:
100%,正则表达式绝对是必经之路!注意,这个语法是 mysql。 如果字符串中只有 2 个字符怎么办?让我们说'ae'【参考方案2】:在 Microsoft SQL server 中,您可以通过以下查询实现此目的:
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]'
更新 -- 添加 Oracle 查询
--方式一——应该适用于所有Oracle版本
SELECT DISTINCT CITY FROM STATION WHERE REGEXP_LIKE(LOWER(CITY), '^[aeiou]') and REGEXP_LIKE(LOWER(CITY), '[aeiou]$');
--Way 2 --在某些版本的Oracle中可能会失败
SELECT DISTINCT CITY FROM STATION WHERE REGEXP_LIKE(LOWER(CITY), '^[aeiou].*[aeiou]');
--Way 3 --在某些版本的Oracle中可能会失败
SELECT DISTINCT CITY FROM STATION WHERE REGEXP_LIKE(CITY, '^[aeiou].*[aeiou]', 'i');
【讨论】:
Oracle SQL 有这样的速记查询吗? 我喜欢这个解决方案。我觉得这里不需要 REGEXP。这似乎是最简单/优雅的 在 Microsoft SQL 服务器中,您可以通过以下查询实现此目的: select distinct city from station where city like '[aeiou]%';【参考方案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]$'
【讨论】:
纯属好奇......引擎是否足够聪明,可以使用索引(而不是全表扫描)? 我不这么认为,但你可以通过EXPLAIN
确认。
我刚刚检查了我的一张表,它没有使用索引。
@Barmar .* 是什么意思。你能解释一下吗
.
匹配任意字符,*
匹配前面模式的任意数字(包括 0)。所以.*
匹配任何东西。前往 www.regular-expression.info 阅读正则表达式教程。【参考方案4】:
您可以尝试一种简单的 MySQL 解决方案:
SELECT DISTINCT city FROM station WHERE city REGEXP "^[aeiou].*[aeiou]$";
【讨论】:
【参考方案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');
【讨论】:
好方法!一个问题,它是同时检查大写 AIEOU 和小 aieou 还是只检查大写?【参考方案6】:您可以将第一个和最后一个字符子串并与 IN 关键字进行比较,
WHERE SUBSTRING(NAME,1,1) IN (a,e,i,o,u) AND SUBSTRING(NAME,-1) IN (a,e,i,o,u)
【讨论】:
您的查询可能需要对 IN 括号内的字符使用单引号。【参考方案7】:以下查询适用于 Orale 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');
【讨论】:
感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。【参考方案8】:您可以使用以下正则表达式并反转结果:
^[^aeiou]|[^aeiou]$
即使输入由单个字符组成,这也有效。它应该适用于不同的正则表达式引擎。
MySQL
SELECT city
FROM (
SELECT 'xx' AS city UNION
SELECT 'ax' UNION
SELECT 'xa' UNION
SELECT 'aa' UNION
SELECT 'x' UNION
SELECT 'a'
) AS station
WHERE NOT city REGEXP '^[^aeiou]|[^aeiou]$'
PostgreSQL
WHERE NOT city ~ '^[^aeiou]|[^aeiou]$'
Oracle
WHERE NOT REGEXP_LIKE(city, '^[^aeiou]|[^aeiou]$')`
SQL Server
不支持正则表达式。使用带方括号的LIKE
子句:
WHERE city LIKE '[aeiou]%' AND city LIKE '%[aeiou]'
【讨论】:
【参考方案9】: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'
)
【讨论】:
【参考方案10】:以下在 MySQL 中为我工作:
SELECT DISTINCT CITY FROM STATION WHERE SUBSTR(CITY,1,1) IN ('A','E','I','O','U') AND SUBSTR(CITY,-1,1) in ('A','E','I','O','U');
【讨论】:
【参考方案11】:尝试以下方法:
select distinct city
from station
where city like '%[aeuio]'and city like '[aeuio]%' Order by City;
【讨论】:
【参考方案12】:我希望这会有所帮助
select distinct city from station where lower(substring(city,1,1)) in ('a','e','i','o','u') and lower(substring(city,length(city),length(city))) 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】:在甲骨文中:
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');
【讨论】:
【参考方案15】:试试这个以元音开头
甲骨文:
select distinct *field* from *tablename* where SUBSTR(*sort field*,1,1) IN('A','E','I','O','U') Order by *Sort Field*;
【讨论】:
【参考方案16】:用于 MS 访问或 MYSQL 服务器
SELECT city FROM station
WHERE City LIKE '[aeiou]%'and City LIKE '%[aeiou]';
【讨论】:
欢迎来到 Stack Overflow。当我写这篇评论时,可能有人已经在编辑你的帖子了。下次您要回答问题时,请考虑将代码封装到代码块中。【参考方案17】:你也可以做这样的硬编码,你检查每一个可能的情况,这对初学者来说很容易理解
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'
【讨论】:
FOR MS SQL --> 在 where 子句中,您还可以添加CITY LIKE '[a,e,i,o,u]%[a,e,i,o,u]'
来避免键入所有可能的组合。根据需要添加到方括号中。【参考方案18】:
您可以使用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')
【讨论】:
【参考方案19】:试试下面的代码,
SELECT DISTINCT CITY
FROM STATIOn
WHERE city RLIKE '^[aeiouAEIOU].*.[aeiouAEIOU]$'
【讨论】:
【参考方案20】:以下两个语句都可以在 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;
【讨论】:
【参考方案21】:SELECT DISTINCT city
FROM station
WHERE city RLIKE '^[^aeiouAEIOU]'OR city RLIKE'[^aeiouAEIOU]$'
【讨论】:
抱歉!上面的查询结果是没有元音作为第一个或最后一个字符的城市 请尝试以下操作:SELECT DISTINCT city FROM station WHERE city RLIKE '^[aeiouAEIOU]' OR city RLIKE'[aeiouAEIOU]$' 尝试发布新问题的答案。这是在 2014 年提出的,并且已经有一个公认的答案。新问题需要您更多关注。【参考方案22】:尝试以下方法:
select distinct city from station where city REGEXP '^[aeiou]' and city REGEXP '[aeiou]$';
【讨论】:
【参考方案23】:对于甲骨文:
SELECT DISTINCT city
FROM station
WHERE REGEXP_LIKE(city, '^[aeiou].*[aeiou]$','i') ;
【讨论】:
【参考方案24】:select distinct(city) from STATION
where lower(substr(city, -1)) in ('a','e','i','o','u')
and lower(substr(city, 1,1)) in ('a','e','i','o','u');
【讨论】:
【参考方案25】:在 MS SQL 中使用简单的左、右函数为我工作
select city from station where left(city,1) in ('a','e','i','o','u') and right(city,1) in ('a','e','i','o','u')
【讨论】:
【参考方案26】:SELECT DISTINCT CITY From STATION WHERE LOWER(SUBSTR(CITY,1,1)) IN ('a','e','i','o','u');
这将在我的 sql 中工作
【讨论】:
【参考方案27】:我的简单解决方案
SELECT DISTINCT CITY
FROM STATION
WHERE CITY LIKE '[a,e,i,o,u]%[a,e,i,o,u]';
【讨论】:
这与这篇文章的现有答案有什么不同?例如,***.com/a/40073750/5411817。【参考方案28】:这适用于甲骨文:
select distinct COLUMN_NAME
from TABLE_NAME
where
--convert first character and check for vowel
lower(substr(COLUMN_NAME, 1, 1)) IN ('a', 'e', 'i', 'o', 'u')
and
--convert last character and check for vowel
lower(substr(COLUMN_NAME, -1, 1)) IN ('a', 'e', 'i', 'o', 'u')
order by COLUMN_NAME asc;
【讨论】:
【参考方案29】:如果您使用的是 Sequal 服务器管理工作室 (SSMS)
选择不同的城市 从车站 WHERE CITY LIKE '[a,e,i,o,u]%[a,e,i,o,u]';
【讨论】:
【参考方案30】:FOR 查询 STATION 中以元音(即 a、e、i、o 和 u)为首的 CITY 名称列表和最后一个字符。您的结果不能包含重复项。
选择我的 SQL 作为首选引擎
SELECT DISTINCT(CITY) FROM STATION WHERE CITY REGEXP '^[AEIOUaeiou]' AND CITY REGEXP '[AEIOUaeiou]$' ;
非常简单的答案。
【讨论】:
以上是关于用于检查名称是不是以元音开头和结尾的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章