我有带序列的字符串。理想的字符串是01-02-03-04,但在一些记录中我遗漏了:
---------
| seq0 |
| ----- |
| 01-04 |
| 02-03 |
| 02-04 |
| 01-04 |
| 02 |
---------
这些都是例子。任何组合都是可能的。为了更好地识别丢失的内容,我想为丢失的内容插入xx,以获得以下信息:
-----------------------
| seq0 | seq1 |
| ----- | ----------- |
| 01-04 | 01-xx-xx-04 |
| 02-03 | xx-02-03-xx |
| 02-04 | xx-02-xx-04 |
| 01-04 | 01-xx-xx-04 |
| 02 | xx-02-xx-xx |
-----------------------
我有一个使用regexp和replace的解决方案(见下文)。但是如果序列较长(例如:01-…-12),那么编写代码将很麻烦。我想知道有没有别的办法。我可以使用短过程(mysql),但也许有一种优雅的方法可以用(几乎)纯sql来实现这一点。
生成表的代码:
DROP TABLE IF EXISTS t0;
CREATE TABLE t0 (
seq0 VARCHAR(100)
, seq1 VARCHAR(100)
);
INSERT INTO t0 (seq0) VALUES
('01-04')
,('02-03')
,('02-04')
,('01-04')
,('02')
;
SELECT * FROM t0;
UPDATE t0
SET seq1 = seq0
-- insert xx
, seq1 = CASE WHEN seq1 REGEXP '01-03' THEN REPLACE(seq1,'01-03','01-xx-03') ELSE seq1 END
, seq1 = CASE WHEN seq1 REGEXP '01-04' THEN REPLACE(seq1,'01-04','01-xx-xx-04') ELSE seq1 END
, seq1 = CASE WHEN seq1 REGEXP '02-04' THEN REPLACE(seq1,'02-04','02-xx-04') ELSE seq1 END
-- right pad xx
, seq1 = CASE WHEN seq1 REGEXP '01$' THEN REPLACE(seq1,'01','01-xx-xx-xx') ELSE seq1 END
, seq1 = CASE WHEN seq1 REGEXP '02$' THEN REPLACE(seq1,'02','02-xx-xx') ELSE seq1 END
, seq1 = CASE WHEN seq1 REGEXP '03$' THEN REPLACE(seq1,'03','03-xx') ELSE seq1 END
-- left pad xx
, seq1 = CASE WHEN seq1 REGEXP '^02' THEN REPLACE(seq1,'02','xx-02') ELSE seq1 END
, seq1 = CASE WHEN seq1 REGEXP '^03' THEN REPLACE(seq1,'03','xx-xx-03') ELSE seq1 END
, seq1 = CASE WHEN seq1 REGEXP '^04' THEN REPLACE(seq1,'04','xx-xx-xx-04') ELSE seq1 END
;
SELECT * FROM t0;
3条答案
按热度按时间myss37ts1#
一种方法是使用
REPLACE
:dbfiddle演示
输出:
编辑
更高级的形式(如果您不喜欢嵌套多个替换):
D小提琴演示2
输出:
eit6fx6z2#
虽然我上面的答案是好的,但lukasz szozda有一个更简单的方法。如果你只有几个条目,帮你自己一个忙,保持简单,像这样!
如果您需要一个更健壮的选项,可以扩展到更大的序列,那么这里有另一个使用stuff(…)的选项。如果序列变大并且必须对大量记录执行此操作,则它很可能比其他选项更有效。
kuarbcqp3#
我不会使用正则表达式。如果使用c或其他编程语言,速度会快得多,但这应该是可行的。
注意:这不会处理具有错误数据的seq0。