正则表达式带来匹配MySQL

时间:2019-03-07 13:13:53

标签: mysql regex

我正在尝试仅获取sql查询的前两个单词,但我使用的是匹配项:^\w{2}-,但没有成功,因为什么都没给我,我需要获取那些值

BA,CE,DF,ES,GO,在某些数据示例下面,我不知道该怎么办。

SC&Tipo=FM
SC&Tipo=Web
SC&Tipo=Comunitaria
RS&Tipo=Todas
RS&Tipo=AM
RS&Tipo=FM
RS&Tipo=Web
RS&Tipo=Comunitaria
BA-Salvador&Tipo=12horas
CE-Fortaleza&Tipo=12horas
CE-Interior&Tipo=12horas
DF-Brasilia&Tipo=12horas
ES-Interior&Tipo=12horas
ES-Vitoria&Tipo=12horas
GO-Goiania&Tipo=12horas
MG-ZonaDaMata/LestedeMinas&Tipo=12horas
MG-AltoParanaiba&Tipo=12horas
MG-BeloHorizonte&Tipo=12horas
MG-CentroOestedeMinas&Tipo=12horas

查询:SELECT * FROM tabel WHERE filter REGEXP '^\w{2}-'

已解决编辑问题:

要解决的查询应为: SELECT SUBSTRING(column, 1, 2) AS column FROM table WHERE column REGEXP '^[[:alnum:]_]{2}-'

2 个答案:

答案 0 :(得分:1)

使用SUBSTRING(<column>, 1, 2)也应该可以。

或多或少像下面

SELECT 
   <column>
 , SUBSTRING(<column>, 1, 2) 
FROM
 <table>
WHERE 
 SUBSTRING(<column>, 1, 2) IN ('BA' [,<value>..])

有些事情是SQL代码中的BNF(巴科斯·纳尔形式)。

<..>表示替换为您需要的内容。
[, ..]表示可选的无限制重复逗号,其中SQL语法有一部分

答案 1 :(得分:1)

MySQL不支持字符类\w\d。您必须使用\w来代替[[:alnum:]]。您可以找到所有受支持的character classes on the official MySQL documentation

因此,您可以使用REGEXP使用以下解决方案:

SELECT * 
FROM table_name 
WHERE filter REGEXP '^[[:alnum:]]{2}-'

您也可以使用REGEXP_SUBSTR使用以下命令通过正则表达式获得结果:

SELECT REGEXP_SUBSTR(filter, '^[[:alnum:]]{2}-') 
FROM table_name 
WHERE filter REGEXP '^[[:alnum:]]{2}-';

或使用HAVING过滤结果的另一种解决方案:

SELECT REGEXP_SUBSTR(filter, '^[[:alnum:]]{2}-') AS colResult 
FROM table_name 
HAVING colResult IS NOT NULL; 

要在MySQL 8.0之前获取值,可以在LEFT中使用以下内容:

SELECT LEFT(filter, 3) 
FROM table_name 
WHERE filter REGEXP '^[[:alnum:]]{2}-';
  

演示: https://www.db-fiddle.com/f/7mJEmCkEiYhCYK3PcEZTNE/0