从序列号的特定部分删除零(如果有)
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))
从 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), '-'))
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)
我有很多产品的序列号格式如下:
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))
从 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), '-'))
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)