我有一个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
? >
答案 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 post或this other one,了解主要依赖MySQL函数的解决方案。