0

ここで同様の質問に基づいてこのソリューションを作成しましたが、私の例はそこで引用されている例よりもはるかに大きくなっています。私のソリューションは機能しますが、それが最善/最も効率的かどうか疑問に思っています。

1 つの注意点: これは、単純なクエリとして実行できるようにするために必要です。

この SQL を作成して、文字列を複数の列に分割しました。次の理由により、変数をそこに残しました。

  1. それは実際の文字列よりも短く、
  2. 質問することはあまり重要ではありません。

実行時に、その変数は 13 個のコンマで区切られた 14 個の値を持つ文字列に置き換えられます。最後の 3 つの値を連結する必要があります。

これ以上苦労することなく、ここに私のクエリがあります:

select  
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  1)   c1, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  2)   c2, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  3)   c3, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  4)   c4, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  5)   c5, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  6)   c6, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  7)   c7, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  8)   c8, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1,  9)   c9, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1, 10)  c10, 
            regexp_substr('$CSV Text Single Line$','[^,]+',1, 11)  c11, 
    replace(regexp_substr('$CSV Text Single Line$','[^,]+',1, 12)  
            ||','|| 
            regexp_substr('$CSV Text Single Line$','[^,]+',1, 13)  
            ||','|| 
            regexp_substr('$CSV Text Single Line$','[^,]+',1, 14) 
            ,'"','')                                               c12 
from dual 

アドバイスをよろしくお願いします。

4

2 に答える 2

1

醜い部分は、CSV 文字列がクエリに複数回出現することです。私が見る改善は、その文字列をサブクエリで分離することです:

with
  csv as (
    select '$CSV Text Single Line$' str 
      from dual)
select regexp_substr(str,'[^,]+', 1,  1)   c1, 
       regexp_substr(str,'[^,]+', 1,  2)   c2, 
       regexp_substr(str,'[^,]+', 1,  6)   c6, 
       regexp_substr(str,'[^,]+', 1,  7)   c7, 
       regexp_substr(str,'[^,]+', 1,  8)   c8, 
       regexp_substr(str,'[^,]+', 1,  9)   c9, 
       regexp_substr(str,'[^,]+', 1, 10)  c10, 
       regexp_substr(str,'[^,]+', 1, 11)  c11, 
       replace(regexp_substr(str,'[^,]+', 1, 12)  ||','|| 
          regexp_substr(str,'[^,]+', 1, 13)  ||','|| 
          regexp_substr(str,'[^,]+', 1, 14) ,'"','') c12 
from csv;

長い CSV 文字列の場合、特にハードコードされた異なる CSV 文字列を使用してこのクエリを頻繁に実行する場合は、共有プール領域の貴重なスペースを節約できます。バインドを使用する場合、11 ではなく 1 つの変数をバインドするだけで十分であるという利点があります。

于 2013-11-13T10:06:58.407 に答える
0

正規表現はコストがかかる場合があります。最後の列では、3 つの正規表現関数を使用して連結する代わりに、単純な SUBSTR を使用できます。

select replace(
               substr('$CSV Text Single Line$', 
                      instr('$CSV Text Single Line$',',',-1,3) + 1
                     ),
              '"',''
              ) as c12
from dual;
于 2013-11-13T11:26:32.800 に答える