2014-03-26 58 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),它允許使用過程邏輯和處理步驟來實現標準的數據庫查詢語言功能。請享用! –