У меня есть строки с последовательностями. Идеальная строка - 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;