2017-01-10 2 views
-3

例:エキスOracleで正規表現を使用した範囲のすべての値

'R1-R5,C1-C2,W11-W14' 

はなります:あなたの要素を仮定し

'R1,R2,R3,R4,R5,C1,C2,W11,W12,W13,W14' 
+0

ようこそ。ここでは[質問]と質問を改善するのに役立つ[mcve]の構築方法について説明します。他の人の中でも、 "これを行う方法"のような質問は、何の努力もしていなければ、通常は歓迎されないと考えてください。いくつかのヒント:これまでに試したこと、試してみた結果、検索した結果、データのフォーマットを整え、テーブル構造を明確にする(最初の文字列は単一の値ですか?連結の結果ですか? – Aleksej

+0

また、R5が必要な結果に重複しているのはなぜですか? – Aleksej

+0

申し訳ありませんが、誤ってR5を複製しないでください。この例は、Oracle表の列にvarchar2(500)として格納されています –

答えて

0

Xは単一の文字である形XN-XMで常にあり、NMは整数の正数でN<Mです。

with yourString(s) as (select 'R1-R5,C1-C2,W11-W14' from dual) 
select listagg(substr(s, 0, 1) || to_char(level -1 + to_number(substr(s, 2, instr(s, '-') -2))), ',') 
       within group (order by l, level) 
from (
     SELECT regexp_substr(s, '[^,]+', 1, level) s, level as l 
      FROM yourString 
     CONNECT BY instr(s, ',', 1, level - 1) > 0 
    ) 
connect by level -1 + to_number(substr(s, 2, instr(s, '-') -2)) <= to_number(substr(s, instr(s, '-') +2)) 
     and prior sys_guid() is not null 
     and prior l = l 
order by 1 

ここでは、内側の文字を1つの間隔(たとえば、R1-R5)に分割するために内側のCONNECT BYが使用され、外側の文字は範囲に応じて行が「複製」されます。

listaggは、元の文字列内の位置とその範囲内の単一項目の値によって与えられた順序に従って、結果の文字列を単純に集約します。

+0

ありがとう!それはうまく動作します –

+0

答えがあなたのために右なら、それを受け入れてください。 [ここで](http://stackoverflow.com/help/someone-answers)誰かが答えたときに何をすべきかを見つける – Aleksej

関連する問題