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

时间:2019-03-11 21:15:20

标签: mysql sql regex

我有一个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? >

1 个答案:

答案 0 :(得分: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      |

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