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                 |
-----------------------------------------------

しかし実際には、これらの 2 つのフィールドは CLOB であり、星の区切り記号はなく、ワードラップの区切り記号があるため、実際のデータは次のようになります。

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

CLOB では REGEXP_SUBSTR を使用できず、wordrap デリミネータの処理方法がわからないため、Varchar フィールドと星形デリミネータで得た結果と同じ結果を得ようとしています。ヒントを教えてください。どうもありがとう。

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

clob関数をvarchar2使用して変換できto_charます。


編集:
CLOBの 場合Name_Authorは、試してください

  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 に答える