MySQL:如何创建存储过程通过正则表达式从Score列取值并设置S列的值
实现正则匹配更新列值的存储过程方案
当然可以实现这个需求!下面我会给出适配MySQL的存储过程实现,完全贴合你给出的匹配规则和数据场景:
原始数据
| Score | S |
|---|---|
| 0 / 64 | |
| 10/64 | |
| NF |
期望结果
| Score | S |
|---|---|
| 0 / 64 | 0 |
| 10/64 | 10 |
| NF | NULL |
存储过程实现
DELIMITER // CREATE PROCEDURE UpdateScoreToS() BEGIN UPDATE your_table_name SET S = CASE -- 匹配带/的分数格式,提取数字部分 WHEN Score REGEXP '\\s*[0-9]+\\s*/' THEN REGEXP_SUBSTR(Score, '\\s*([0-9]+)\\s*/', 1, 1, '', 1) -- 匹配NF时设置为NULL WHEN Score = 'NF' THEN NULL -- 其他情况保留原S值(可根据需求调整) ELSE S END; END // DELIMITER ;
关键说明
- 请将代码中的
your_table_name替换为你实际使用的表名 - 我把正则里的
[0-9]*改成了[0-9]+,避免匹配到空数字(比如如果Score是/64这种无效值,会返回NULL而不是空字符串,更贴合实际需求) - MySQL的
REGEXP_SUBSTR函数最后一个参数1表示提取第一个捕获组的内容,正好对应你正则里括号包裹的数字部分 - 执行存储过程的命令:
CALL UpdateScoreToS();
如果你的数据库是其他类型(比如PostgreSQL、SQL Server),正则函数会有差异,比如PostgreSQL可以用substring(Score FROM '\\s*([0-9]+)\\s*/')来实现相同的提取逻辑。
内容的提问来源于stack exchange,提问作者Gwydion Mordred
相关产品推荐
相关产品推荐

