我将单行分成两个单独的行时遇到了困难。
我的测试架构是:
CREATE TABLE T
(id int,
old varchar2(24),
new varchar2(24))
;
旧的和新的是需要拆分的字符串,例如:
INTO T (id, old, new)
VALUES (14, 'L-D / T-E', 'L-E / T-E')
INTO T (id, old, new)
VALUES (14, 'L-D / T-E', 'L-D / T-D')
INTO T (id, old, new)
VALUES (12, 'L-D / T-E', 'L-E / T-D')
在此示例中,'L'在第1行中已更改,'T'在第2行中已更改,且两者在第3行中均已更改
表格是:
ID OLD NEW
14 L-D / T-E L-E / T-E
14 L-D / T-E L-D / T-D
12 L-D / T-E L-E / T-D
我正在尝试拆分它们,以便生成的表对于每个重要更改都有单独的行,这样结果将如下所示:
ID OLD NEW
1 L-D L-E //for existing row 1
2 T-E T-D //for existing row 2
//then two rows for existing row 3
3 L-D L-E
4 T-E T-D
一旦插入了这些行,我就会删除现有的行。
我已经设置了一个方形小册子:http://sqlfiddle.com/#!4/0213a/1 - 请记住我正在更新这个,因为我工作所以它可能看起来像任何给定点的火车残骸。
感谢您的帮助。
编辑更新:
我正在尝试这个但获得的数据超出了我的要求,我认为where子句存在问题:
drop table t;
CREATE TABLE T
(id int,
old varchar2(24),
new varchar2(24))
;
INSERT ALL
INTO T (id, old, new)
VALUES (12, 'L-D / T-E', 'L-E / T-E')
INTO T (id, old, new)
VALUES (13, 'L-D / T-E', 'L-D / T-D')
INTO T (id, old, new)
VALUES (14, 'L-D / T-E', 'L-E / T-D')
SELECT * FROM dual
;
SELECT * FROM T;
--insert into t (id, old, new) values (1,'dasdsad', 'asdasd');
BEGIN
INSERT INTO t (id,old, new)
WITH DATA AS
(SELECT id,OLD, new
FROM t
WHERE
--multiple changes
--(SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
--AND SUBSTR(OLD, 9) <> SUBSTR(NEW, 9))
--OR
(--row 2
(SUBSTR(OLD,3,1) = SUBSTR(NEW, 3,1)
AND SUBSTR(OLD, 9) <> SUBSTR(NEW, 9))
)
OR
(--row 1
(SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
AND SUBSTR(OLD, 9) = SUBSTR(NEW, 9))
)
)
SELECT id, trim(regexp_substr(OLD, '[^/]+', 1, LEVEL)) OLD,
trim(regexp_substr(NEW, '[^/]+', 1, LEVEL)) NEW
FROM DATA
CONNECT BY LEVEL <= regexp_count(old, '/')+1;
END;
/
输出:
12 L-D / T-E L-E / T-E
13 L-D / T-E L-D / T-D
14 L-D / T-E L-E / T-D
12 L-D L-E
12 T-E T-E
13 T-E T-D
13 L-D L-D
12 T-E T-E
13 T-E T-D
第12行的目标应该只有一次。
答案 0 :(得分:1)
应该是简单的方法:
标识要拆分的行:
SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
AND
SUBSTR(OLD, 9) <> SUBSTR(NEW, 9)
要拆分行,请查看:
例如,
SQL> WITH DATA AS
2 (SELECT OLD
3 FROM t
4 WHERE SUBSTR(OLD,3,1) <> SUBSTR(NEW, 3,1)
5 AND SUBSTR(OLD, 9) <> SUBSTR(NEW, 9)
6 )
7 SELECT trim(regexp_substr(OLD, '[^/]+', 1, LEVEL)) OLD
8 FROM data
9 CONNECT BY LEVEL <= regexp_count(OLD, '/')+1;
OLD
------------------------
L-D
T-E
SQL>
现在您需要做的就是 INSERT 上面的 SELECT 语句和 DELETE 旧行,因为我展示了here