2013-03-25 83 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