处理CLOB字段中的单词rap分隔符

时间:2013-03-25 18:56:08

标签: regex oracle

我在下面有这个请求,它完全符合我的要求,但只有在字段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

1 个答案:

答案 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)个符号。