MySQL LIKE运算符无法正常运行以进行模式匹配

时间:2020-01-27 15:12:08

标签: mysql sql regex sql-like

我得到了一个关系表 STATION ,如下所示:

+------+----------------+-------+-------+--------+
| ID   | CITY           | STATE | LAT_N | LONG_W |
+------+----------------+-------+-------+--------+
|  794 | Kissee Mills   | MO    |   140 |     73 |
|  824 | Loma Mar       | CA    |    49 |    131 |
|  603 | Sandy Hook     | CT    |    72 |    148 |
|  478 | Tipton         | IN    |    34 |     98 |
|  619 | Arlington      | CO    |    75 |     93 |
|  711 | Turner         | AR    |    50 |    101 |
|  839 | Slidell        | LA    |    85 |    152 |
|  342 | Chignik Lagoon | AK    |   103 |    153 |
+------+----------------+-------+-------+--------+

并且我需要执行以下查询:

从STATION查询以元音(即a,e,i,o或u)开头的CITY名称列表。

我正在Ubuntu OS上使用MySQL 5.7版。

现在,这是我的尝试:

SELECT CITY
FROM STATION
WHERE LOWER(CITY) LIKE '[aeiou]%';

但是没有不能产生所需的结果。我得到一个空集作为输出。但是,这很好用:

SELECT CITY
FROM STATION
WHERE LOWER(CITY) REGEXP '^[aeiou]';

我想知道使用LIKE运算符的第一种方法有什么问题吗?我是SQL新手,所以如果做错了事,请原谅。

谢谢您的时间。

2 个答案:

答案 0 :(得分:1)

MySQL中的

SELECT c1, c2, c3 - nvl(lag(c3) OVER (PARTITION BY c2 ORDER BY c1), c3) as diff FROM t; 不支持通配符。您可以对正则表达式执行类似的操作:

LIKE

答案 1 :(得分:0)

LIKEREGEXP遵循的模式匹配规则不同。 REGEXP支持正则表达式,而LIKE可以理解通配符'_'(单个字符)和'%'(任意数量的字符,根本不包含任何字符)。

这在the pattern matching documentation中有很好的解释:

SQL模式匹配使您可以使用_来匹配任何单个字符,并使用%来匹配任意数量的字符(包括零个字符)。在MySQL中,默认情况下,SQL模式不区分大小写。这里显示了一些示例。使用SQL模式时,请勿使用=或<>。改用LIKE或NOT LIKE比较运算符。

[...]

MySQL提供的另一种模式匹配使用扩展的正则表达式。在测试这种模式的匹配项时,请使用REGEXP_LIKE()函数(或REGEXP或RLIKE运算符,它们是REGEXP_LIKE()的同义词)。

侧面说明:两种模式匹配方法默认情况下都不区分大小写(除非您使用某些特殊归类),因此可以将正则表达式简化为不使用lower()函数:

city like regexp '^[aeiou]'

如果要用like来表示,那就是:

city like 'a%' 
or city like 'e%'
or city like 'i%'
or city like 'o%'
or city like 'u%'