mysql - Regex 带来恰到好处的匹配 MySQL

标签 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}-'

最佳答案

MySQL 不支持字符类 \w\d。您必须使用 [[:alnum:]] 而不是 \w。您可以找到所有支持的 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}-';

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

关于mysql - Regex 带来恰到好处的匹配 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55044686/

相关文章:

javascript - 正则表达式匹配特定字符串开头结尾的任意字符

regex - 从初始值设定项返回而不初始化正则表达式类中的所有存储属性错误

regex - 如何在正则表达式模式中包含变量

php - 使用单独的 where 子句连接 3 个表

asp.net - 基于 ASP.NET 的网站的数据库建议和最佳实践?

php - 基于现有行的受控表查询

php - JavaScript 正则表达式 : PHP like Callback Variable

c - emacs 正则表达式替换 C 函数调用

php - 带有两个 JOINS 和两个 SET 字段的 mySQL UPDATE

mysql - SQL:首先显示 future 的记录,然后是其余的。均按 create_date DESC