将具有长字符串的列拆分为每行1个字sql

时间:2014-03-26 14:18:28

标签: plsql oracle11g

我已经看到了关于stackoverflow的类似问题,但没有一个只用1列专门处理---我有一个列,其中每行有多个单词。我设置行,以便用#分隔单词。我现在想要它以便解析字符串并且每行只有一个字。这是列当前的样子(当前大约1500行):

TEST
 ---------------------------------------------
 SPOKE#WITH#MR#SMITHS#ASSISTANT
 MRS#MOODY#REFUSED#A#VISIT
 SCHEDULING#OFFICE#LEFT#A#MESSAGE#FOR#VISIT
 LEFT#A#MESSAGE#FOR#VISIT
 SCHEDULING#OFFICE#SCHEDULED#AN#APPOINTMENT#FOR#DR#JOHNSON
 PHONE#CALL
 ---------------------------------------------

我希望它看起来像这样:

TEST
-------------------
SPOKE
WITH
MR
SMITHS
ASSISTANT
MRS
MOODY
REFUSED
A
VISIT
SCHEDULING
OFFICE
LEFT
etc... etc... etc...
-------------------

我对这种类型的查询比较陌生,所以你可以指出的任何教程或文档也会有所帮助。我正在使用TOAD和OracleSQL。谢谢。

1 个答案:

答案 0 :(得分:2)

由于您处于Oracle PL/SQL领域,因此有一组有用的函数称为REGULAR EXPRESSIONS。将分隔的字符串拆分为较小的字符串符合REGEXP_SUBSTR函数的类别,如以下示例所示:

  

编辑:发现疏忽:分隔系列中的最后一个数字不在输出中。分隔符的数量比系列中的元素数少1 ... LOOP次迭代次数已更新。

查询演示

 DECLARE
   x varchar2(100);
   y pls_integer;
   z pls_integer;
   c VARCHAR2(40) := '1:3:4:6:8:10:3:4:7:6:11:12';
 BEGIN
   y := length(c) - length(replace(c,':'));  
   if y > 0 then
      for z in 1 .. (y+1) loop
      x := REGEXP_SUBSTR(c,'[^:]+', 1, z);
      dbms_output.put_line(x);

      end loop;
      x :- REGEXP_SUBSTR(c,'[
   end if;
 end;

输出:

 1
 3
 4
 6
 8
 10
 3
 4
 7
 6
 11

 Statement processed.

 0.01 seconds

使用OP的示例

      DECLARE
        cursor str_cursor is
           select string_val
             from test_split_string;

        x varchar2(100);
        y pls_integer;
        z pls_integer;
      BEGIN
        for n in str_cursor loop
           y := length(n.string_val) - length(replace(n.string_val,'#'));  
           for z in 1 .. (y+1) loop       
              x := REGEXP_SUBSTR(n.string_val,'[^#]+', 1, z);
              dbms_output.put_line(x);
           end loop;
        end loop;
      end;

示例2的结果

 MRS
 MOODY
 REFUSED
 A
 SCHEDULING
 OFFICE
 LEFT
 A
 MESSAGE
 FOR
 LEFT
 A
 MESSAGE
 FOR
 SPOKE
 WITH
 MR
 ETC... ETC... ETC...

对术语ORACLE REGULAR EXPRESSIONS的搜索应该会产生一些良好的网络资源,以记录可用的其他功能。