Oracle在两列之间拆分一列数据

时间:2014-04-17 10:07:25

标签: sql oracle oracle10g

我有一个表格,其中一列包含以下数据

head1  [00100 - 00228] lab66  [lab661]

我还有一个表有两列我需要将第一部分插入一列而第二部分数据插入一列没有[]

表一

Column1
--------------------------------------
head1  [00100 - 00228] lab66  [lab661]

注意:这两个数据是一行

表二

column1 | column2
head1       00100 - 00228
lab66       lab661

2 column and 2 rows

任何人都可以帮助我完成这项任务

1 个答案:

答案 0 :(得分:2)

您可以使用regular expressions完成任务。 尝试

 INSERT
   INTO table2 trg ( col1, col2 )
        SELECT RTRIM(REGEXP_REPLACE(src.col1, '^([^'||chr(91)||']+)\[[^'||chr(93)||']+\].*$', '\1'))
             , LTRIM(REGEXP_REPLACE(src.col1, '^[^'||chr(91)||']+\[([^'||chr(93)||']+)\].*$', '\1'))
          FROM table1 src
      ;

说明:

  • 正则表达式模式描述了源列内容的结构(文本+括号中的文本)。请注意......

    • 每个记录的列必须与此结构匹配。
    • 由于在模式中使用^$
    • 列的完整内容已匹配。
    • []在正则表达式中携带语义,因此必须将它们转义为文字字符。 编辑规范转义(\[\])不起作用,因此您必须使用oracles chr函数表达符号(记得基本的?:-) ))
  • 正则表达式中的括号表示有趣的'与模式匹配的数据部分 - 对于第一列,即括号前的文本,第二列是其中的部分。

  • REGEXP_REPLACE函数将替换模式的源列部分替换为替换字符串。当模式匹配整个字符串时,它将替换整个字符串。

  • 替换字符串包含所谓的'反向引用'到第一个有趣的部分'匹配 - 这是与括号中的模式部分对应的部分。

  • 修剪函数删除尾随/前导空格。

修改 测试脚本可用here

编辑#2: op实际上有 2 个数据部分要在源表的 1 列中进行分区。这可以通过升级模式以匹配第二项来通过2个插入语句(或选择1语句中的联合)来处理:

INSERT
       INTO test_tab2 trg ( col1, col2 )
            SELECT RTRIM(REGEXP_REPLACE(REPLACE(REPLACE(src.col1, CHR(10), ' '), CHR(13), ' '), '^([^'||chr(91)||']+)\[[^'||chr(93)||']+\].*$', '\1'))
                 , LTRIM(REGEXP_REPLACE(REPLACE(REPLACE(src.col1, CHR(10), ' '), CHR(13), ' '), '^[^'||chr(91)||']+\[([^'||chr(93)||']+)\].*$', '\1'))
             FROM test_tab1 src
         ;
INSERT
       INTO test_tab2 trg ( col1, col2 )
            SELECT RTRIM(REGEXP_REPLACE(REPLACE(REPLACE(src.col1, CHR(10), ' '), CHR(13), ' '), '^[^'||chr(91)||']+\[[^'||chr(93)||']+\][ ]*([^'||chr(91)||']+)\[[^'||chr(93)||']+\].*$', '\1'))
                 , LTRIM(REGEXP_REPLACE(REPLACE(REPLACE(src.col1, CHR(10), ' '), CHR(13), ' '), '^[^'||chr(91)||']+\[[^'||chr(93)||']+\][ ]*[^'||chr(91)||']+\[([^'||chr(93)||']+)\].*$', '\1'))
              FROM test_tab1 src
          ;

可用的测试脚本here

编辑#3: 分隔2个数据部分的空格可以包含换行/回车。 为了简化处理,在select子句中添加了普通的replace调用。

可用的测试脚本here