Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle:使用现有表中的值和新值插入行_Sql_String_Oracle_Split - Fatal编程技术网

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>