用于检查名称是不是以元音开头和结尾的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

在SQL中,我想显示以元音结尾的所有城市的名称

在 SQL 中,我想显示所有以元音结尾的城市的名称

不以元音开头或结尾的单词的正则表达式?

检查字符串是不是相等,以 r 开头以 match 结尾

sql 在SQL SERVER中检索以相同字母开头和结尾的名称

sql 查询city名字开头不含元音字母