我有一个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
?
从评论中,我明白你的主要目的是选择符合你的格式规范的记录(可能是字符串开头的字符,然后是字符串结尾的强制数字)。
你当前查询的问题是第一个正则表达式,'^[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 post或this other one,了解主要依赖MySQL函数的解决方案。