从序列号的特定部分删除零(如果有)

Remove zeros, if any, from a certain part of a serial number

我有很多产品的序列号格式如下:

L12345-001-1
L12346-095-1
L44543-365-0

我需要 运行 一个删除破折号“-”之间项目编号的所有零占位符的查询。因此,正确的查询会将上面的值更改为:

L12345-1-1
L12346-95-1
L44543-365-0

我没有花时间学习正则表达式,需要像昨天一样快速修复。任何帮助将不胜感激。

在 MySQL 5.7 上,您可以使用 SUBSTRING_INDEX and CONCAT_WS 使用以下解决方案:

SELECT CONCAT_WS('-', SUBSTRING_INDEX(snumber, '-', 1), CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(snumber, '-', 2), '-', -1) AS UNSIGNED), SUBSTRING_INDEX(snumber, '-', -1)) 
FROM products

UPDATE 数据库中的值,您可以使用以下解决方案:

UPDATE products 
  SET snumber = CONCAT_WS('-', SUBSTRING_INDEX(snumber, '-', 1), CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(snumber, '-', 2), '-', -1) AS UNSIGNED), SUBSTRING_INDEX(snumber, '-', -1)) 

demo on dbfiddle.uk


从 MySQL 8.0 开始,您可以使用正则表达式来解决这个问题,使用 REGEXP_REPLACE and REGEXP_SUBSTR:

SELECT REGEXP_REPLACE(snumber, '-.*-', CONCAT('-', CAST(REPLACE(REGEXP_SUBSTR(snumber, '-.*-'), '-', '') AS UNSIGNED), '-')) 
FROM products 

UPDATE 数据库中的值,您可以使用以下解决方案:

UPDATE products
  SET snumber = REGEXP_REPLACE(snumber, '-.*-', CONCAT('-', CAST(REPLACE(REGEXP_SUBSTR(snumber, '-.*-'), '-', '') AS UNSIGNED), '-')) 

demo on dbfiddle.uk

REGEX 也在我的待办事项列表中,您可以使用带转换的普通旧子字符串

drop table if exists t;
create table t(id varchar(20));
insert into t values
('L12345-001-1'),
('L12346-095-1'),
('L44543-365-0');


select id,
         concat(substring_index(id,'-',1),
         '-',
         cast(substring_index(substring_index(id,'-',2),'-',-1) as unsigned),
         '-',
         substring_index(id,'-',-1) 
         ) fixed
from T
;

+--------------+--------------+
| id           | fixed        |
+--------------+--------------+
| L12345-001-1 | L12345-1-1   |
| L12346-095-1 | L12346-95-1  |
| L44543-365-0 | L44543-365-0 |
+--------------+--------------+
3 rows in set (0.01 sec)