2014-03-26 28 views
0

我已经看到了与stackoverflow相似的问题,但没有一个字符串只有1列---我有一列每行有多个字。我设置了行,以便用#分隔单词。我现在想让它解析字符串,每行只有一个字。以下是列当前看起来像(目前约1500行):将长字符串拆分为每行1个字sql

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... 
------------------- 

我是比较新的这种类型的查询所以你可以指点我的任何教程或文档也会有所帮助。我在OracleSQL中使用TOAD。谢谢。

回答

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甲搜索应该产生一些良好的网络资源来记录可用的附加特征。

+0

非常详细,谢谢......我想我最困惑的是如何为每个单词创建一个新行,并且我没有意识到你可以使用常见的编程语法来创建逻辑...生病必须做的关于编写这些类型的宏的一些研究 – Ted

+0

谢谢!我想我(被欺骗)了一点,因为你可能正试图在'SQL'编程语言的限制下解决这个问题。如果在纯SQL中完成,这段代码可能会稍微长一点......这仍然是可能的......只是混乱。由于您在'ORACLE'环境中工作,因此可以使用Oracle的SQL自定义扩展(PL/SQL),它允许使用过程逻辑和处理步骤来实现标准的数据库查询语言功能。请享用! –