Oracle:使用现有表和新值中的值插入行

时间:2015-08-01 08:56:22

标签: 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')
  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行的目标应该只有一次。

1 个答案:

答案 0 :(得分:1)

应该是简单的方法:

  • 使用 SUBSTR
  • 标识要拆分的行
  • 使用 REGEXP_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>

现在您需要做的就是 INSERT 上面的 SELECT 语句和 DELETE 旧行,因为我展示了here