SQL中的正则表达式来检测一个或多个数字
Posted
技术标签:
【中文标题】SQL中的正则表达式来检测一个或多个数字【英文标题】:regex in SQL to detect one or more digit 【发布时间】:2014-01-14 16:49:54 【问题描述】:我有以下疑问:
SELECT *
FROM `shop`
WHERE `name` LIKE '%[0-9]+ store%'
我想匹配显示'129387 store'
的字符串,但上面的正则表达式不起作用。这是为什么呢?
【问题讨论】:
对于那些寻找 Oracle SQL 的人:使用WHERE REGEXP_LIKE(name, '.[0-9]+ store.')
【参考方案1】:
如果你指的是 mysql,LIKE
没有实现正则表达式。它实现了更受限制的 SQL 模式匹配,它只有两个特殊运算符:%
匹配任何字符序列,_
匹配任何单个字符。
如果要进行正则表达式匹配,则必须使用REGEXP
或RLIKE
运算符:
SELECT *
FROM shop
WHERE name REGEXP '[0-9]+ store'
MySQL 的正则表达式语言不包括 \d
来指定数字,但您可以这样写:
SELECT *
FROM shop
WHERE name REGEXP '[[:digit:]]+ store'
如果商店名称必须以数字开头,则需要一个锚:
SELECT *
FROM shop
WHERE name REGEXP '^[0-9]+ store'
您可以在regular-expressions.info 了解更多关于正则表达式语法的信息。
【讨论】:
@kba 谢谢,不敢相信我做到了!【参考方案2】:使用REGEXP 运算符代替LIKE 运算符
试试这个:
SELECT '129387 store' REGEXP '^[0-9]* store$';
SELECT * FROM shop WHERE `name` REGEXP '^[0-9]+ store$';
查看SQL FIDDLE DEMO
输出
| NAME |
|--------------|
| 129387 store |
【讨论】:
这将允许129387 something else store
。
@Barmar 它将允许任何 numeric string
在开头和之后的`store`。
不,它没有。 .*
匹配任何内容,因此它将允许数字字符串和 store
之间的任何内容。
您应该使用+
,而不是*
,因为*
允许零重复。见sqlfiddle.com/#!2/306adb/1【参考方案3】:
试试
SELECT *
FROM `shop`
WHERE `name` LIKE '%[0-9] store%'
【讨论】:
以上是关于SQL中的正则表达式来检测一个或多个数字的主要内容,如果未能解决你的问题,请参考以下文章