如何在MySQL查询中使用正则表达式

65

我有一个简单的任务,需要搜索以字符串字符开头并在其后只有一个数字的记录。我的尝试如下所示:

SELECT trecord FROM `tbl` WHERE (trecord LIKE 'ALA[d]%')

而且

SELECT trecord FROM `tbl` WHERE (trecord LIKE 'ALA[0-9]%')

但是这两个查询总是返回一个null记录。

trecord
-------
null

然而,如果我执行以下查询

SELECT trecord FROM `tbl` WHERE (trecord LIKE 'ALA%')

它返回

trecord
-------
ALA0000
ALA0001
ALA0002

这意味着我有以ALA和一个数字开头的记录,

编辑

我正在使用PHP MySQL和InnoDB引擎来实现。


1
请始终使用您正在使用的数据库引擎标记您的问题。我只能猜测它是MySQL。 - Giannis Paraskevopoulos
2
请使用此链接:http://dev.mysql.com/doc/refman/5.1/zh-cn/regexp.html。 - akozin
1
LIKE 不支持正则表达式。仅支持通配符 %_(至少在标准 SQL 和 MySQL 中)。 - user330315
2个回答

86

我认为你可以使用REGEXP代替LIKE。

SELECT trecord FROM `tbl` WHERE (trecord REGEXP '^ALA[0-9]')

1
但它将搜索类似于“ALA101”和“BALA002”的记录,而我只想搜索“ALA101”。 - zzlalani
3
在正则表达式前面添加^。如果你稍微了解一下正则表达式,你就可以随心所欲地使用它。祝你好运! - Wietze314
谢谢@Wietze314,我对正则表达式有点薄弱,不过还是谢谢。 - zzlalani
2
好的,没有 ^ 它会在字符串中搜索每个位置以找到一个模式。包含它会强制从开头开始仅搜索模式 - 换句话说,字符串必须以模式开头。 - MKB
2
@zzlalani 在方括号内使用 ^ 符号表示“不包括”,否则表示“以...开头”。 - modulitos
显示剩余3条评论

6
在我的情况下(Oracle),使用的是WHERE REGEXP_LIKE(column, 'regex.*')。请参见此处

SQL函数

描述


REGEXP_LIKE

此函数搜索一个字符列以查找模式。在查询的WHERE子句中使用此函数,以返回与指定正则表达式匹配的行。

...

REGEXP_REPLACE

此函数在字符列中搜索模式,并用您指定的模式替换每个出现的模式。

...

REGEXP_INSTR

此函数为给定的正则表达式模式搜索字符串。您指定要查找的发生位置和要从哪个位置开始搜索。该函数返回一个整数,表示在字符串中找到匹配项的位置。

...

REGEXP_SUBSTR

此函数返回与指定的正则表达式模式匹配的实际子字符串。

(当然,REGEXP_LIKE仅匹配包含搜索字符串的查询,因此如果您想要完全匹配,您将不得不使用'^$'进行开头(^)和结尾($)匹配,例如:'^regex.*$'。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接