我在下面有这个请求,它完全符合我的要求,但只有在字段Author_ID和Author_Name为VARCHAR并且其中的值由此表中的星号分隔时才会执行此操作:
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而且没有明星分隔符,我有一个wordrap deliminator,所以数据在现实生活中看起来像那样:
ID_BOOK | ID_AUTHOR | NAME AUTHOR |
-----------------------------------------------
001 |01 | AuthorU |
-----------------------------------------------
002 |02*03*04 | AuthorXAuthorYAuthorZ |
我正在尝试使用Varchar字段和星号分隔符获得相同的结果,因为使用CLOB我不能使用REGEXP_SUBSTR而我不知道如何处理wordrap deliminator。你能帮我一些提示吗?非常感谢。
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 :(得分:0)
您可以使用clob
函数将varchar2
转换为to_char
。
编辑:
如果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)
个符号。