0

我在下面有这个请求,它完全符合我的要求,但只有当字段 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 分隔符,所以数据在现实生活中看起来像这样:

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

我试图获得与 Varchar 字段和星号分隔符相同的结果,因为使用 CLOB 我不能使用 REGEXP_SUBSTR 并且我不知道如何处理 wordrap 分隔符。你能帮我一些提示吗?非常感谢。

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
4

1 回答 1

0

您可以转换clobvarchar2使用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)符号。

于 2013-03-25T19:08:23.190 回答