MySQL匹配模式并选择数字和字母

问题描述 投票:1回答:1

我有一个ID列表,这些ID在各种第三方应用程序系统中创建并手动添加到我们的系统中。我需要尝试根据最大数量自动增加这些ID。值可以是完全数字或任意数量的字母,后跟任意数量的数字。

例如:

Array ( [works_id] => MD001 [num] => 0 ) 
Array ( [works_id] => WX9834V [num] => 0 ) 
Array ( [works_id] => WK009 [num] => 0 ) 
Array ( [works_id] => W4KHA2 [num] => 0 ) 
Array ( [works_id] => MD001 [num] => 0 ) 
Array ( [works_id] => DE1234 [num] => 0 ) 
Array ( [works_id] => 99 [num] => 99 ) 
Array ( [works_id] => 100 [num] => 100 )

在上面的例子中,我需要返回'DE'1234,因为1234是匹配模式的最大数字(WX9834V不匹配,因为它是LLNNNNL)

到目前为止,我尝试过:

SELECT  works_id, CAST(works_id as UNSIGNED) as num 
FROM table 
WHERE (works_id REGEXP '^[a-zA-Z]+[0-9]' or works_id REGEXP '^[0-9]+$')

但这会返回所有行并返回数字部分的0,除非它只由数字组成 - 我怎样才能从上面只返回'DE'1234

mysql sql regex
1个回答
1
投票

从评论中,我明白你的主要目的是选择符合你的格式规范的记录(可能是字符串开头的字符,然后是字符串结尾的强制数字)。

你当前查询的问题是第一个正则表达式,'^[a-zA-Z]+[0-9]'过于宽松:它确实允许字段末尾的非数字字符,并且会更好地编写'^[a-zA-Z]+[0-9]+$'

最重要的是,两个正则表达式可以组合成一个:

SELECT works_id 
FROM mytable
WHERE works_id REGEXP '^[a-zA-Z]*[0-9]+$'

正则表达式意味着:

^           beginning of the string
[a-zA-Z]*   0 to N letters
[0-9]+      at least one digit
$           end of string

this db fiddle中,您的测试数据会返回:

| works_id |
| -------- |
| MD001    |
| WK009    |
| MD001    |
| 99       |
| 100      |

注意:在MySQL 8.0之前的版本中,为了找到最大的数字疼痛而分割字符串很难,因为REGEXP_REPLACE等函数不可用。在您的应用程序中执行此操作可能更容易(除非您有大量匹配记录...)。您可以查看this postthis other one,了解主要依赖MySQL函数的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.