Sql Oracle:使用现有表中的值和新值插入行
我很难把一行分成两行 我的测试模式是:Sql Oracle:使用现有表中的值和新值插入行,sql,string,oracle,split,Sql,String,Oracle,Split,我很难把一行分成两行 我的测试模式是: 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')
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')
在本例中,第1行中的“L”已更改,第2行中的“T”已更改,第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
插入这些行后,我想删除现有的行
我已经设置了一个SQLFIDLE:-请记住,我在工作时正在更新它,所以它在任何给定点都可能看起来像火车失事
谢谢你的帮助
编辑并更新:
我正在尝试这一点,但获得的数据超过了我的要求,我认为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行被锁定了3次,而它应该只有一次。应该是实现以下目标的简单方法: 使用SUBSTR标识要拆分的行 使用REGEXP\u SUBSTR拆分行 要标识要拆分的行,请执行以下操作:
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>
现在,您需要做的就是使用上面的SELECT语句插入并删除旧的行,正如我所演示的。这样我就可以看到这里发生了什么:因此,我们使用“with data as”创建一个子集数据,通过使用一个子串,这个子集称为data?-然后,我们从该子集中进行选择,其中“LEVEL”是正则表达式匹配的名称?连接方式是匹配器吗?我不完全理解正在发生的一切,但我有一个更好的主意。请你看一眼,告诉我我做错了什么,好吗?谢谢。你介意看一下更新后的帖子吗?@SteveGreen,拆分字符串的逻辑没有问题,获得额外行的唯一原因是connect by子句中没有限制循环循环。我给出的示例仅适用于1行。当您将其应用于具有多行的表时,需要按照我在这里解释的方式执行lalitkumarb.wordpress.com/2015/03/04/split-comma-delimited-strings-in-a-table-using-oracle-sql/拆分字符串的逻辑没有问题,获得额外行的唯一原因是connect by子句中没有限制的循环。我给出的示例仅适用于1行。当您将其应用于具有多行的表时,需要按照我在这里解释的方式执行lalitkumarb.wordpress.com/2015/03/04/split-comma-delimited-strings-in-a-table-using-oracle-sql/
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>