2013-03-25 80 views
0

下面我有這個要求不正是我想要什麼,但它做它僅當字段AUTHOR_ID和AUTHOR_NAME是VARCHAR以及其中的值由明星都喜歡在此表中分離:手柄wordrap deliminator

ID_BOOK | ID_AUTHOR |  NAME AUTHOR  | 
----------------------------------------------- 
001  |01   | AuthorU     | 
----------------------------------------------- 
002  |02*03*04 | AuthorX*AuthorY*AuthorZ | 
----------------------------------------------- 

請求會給我這樣的結果:

ID_BOOK | ID_AUTHOR |  NAME AUTHOR  | 
----------------------------------------------- 
001  |01   | AuthorU     | 
----------------------------------------------- 
002  |02   | AuthorX     | 
----------------------------------------------- 
002  |03   | AuthorY     | 
----------------------------------------------- 
002  |04   | AuthorZ     | 
----------------------------------------------- 

但在現實生活中這兩個領域是CLOB,沒有明星deliminator,有保險業監督wordrap deliminator,讓數據看起來像在現實生活中:

ID_BOOK | ID_AUTHOR |  NAME AUTHOR  | 
----------------------------------------------- 
001  |01   | AuthorU     | 
----------------------------------------------- 
002  |02*03*04 | AuthorXAuthorYAuthorZ | 

我試圖得到相同的結果,我得到了它的Varchar字段和明星定界符,因爲與CLOB我不能使用REGEXP_SUBSTR,我不知道如何處理字符分界符。你能幫我提一些提示嗎?非常感謝。

SELECT 
ID_Book, 
REGEXP_SUBSTR(ID_Author, '[^*]+', 1, Counter) AS AuthID, 
REGEXP_SUBSTR(Name_Author, '[^*]+', 1, Counter) AS AuthName 
FROM Books 
CROSS JOIN (
    SELECT LEVEL Counter 
    FROM DUAL 
    CONNECT BY LEVEL <= (  
     SELECT MAX(REGEXP_COUNT(ID_Author, '[^*]+')) 
     FROM Books)) 
WHERE REGEXP_SUBSTR(Name_Author, '[^*]+', 1, Counter) IS NOT NULL 
ORDER BY 1, 2 
+0

什麼字符被用作'文字刪除器'? – 2013-03-25 19:06:57

+0

嗨Egor,當我打開SqlDeveloper並查看數據時,它將它們連接顯示出來,但是當我雙擊以更改字段的值時,它會向我顯示一行中的每個值,這就是爲什麼我對自己說過它使用一個可以作爲刪除器但是很不幸,我不能說如何.. – Walloud 2013-03-25 20:15:24

回答

0

你可以使用to_char函數轉換clobvarchar2


編輯:
如果Name_Author是CLOB,嘗試

to_char(REGEXP_SUBSTR(Name_Author, '[^'||chr(10)||chr(13)||']+', 1, Counter)) 

to_char(REGEXP_SUBSTR(Name_Author, '^.*?$', 1, Counter, 'm')) 

後者表達更短,但它不去掉chr(13)符號。

+0

謝謝葉戈爾,但REGEXP_SUBSTR不能正確使用Oracle 9.i我認爲:(即使REGEXP_COUNT不能與Oracle 9.i一起工作,但我找到了解決方法,現在我正在尋找REGEXP_SUBSTR的解決方法,但我不想使用經典的SUBSTR函數,因爲它適用於起始位置和長度。請看一下這個http://www.sqlfiddle。 com /#!4/c0f19/10,謝謝你:) – Walloud 2013-03-25 22:17:52

+0

@Walloud - 在Oracle 9上,你應該使用'substr'和'instr'來代替'REGEXP_SUBSTR'; 'length'和'replace'而不是'REGEXP_COUNT'。行由'chr(10)'char分隔。 – 2013-03-25 22:41:33

+0

謝謝Egor,我會深入研究它:) – Walloud 2013-03-25 22:55:00