7

OracleのSQLを使用して、コンマ区切りの文字列でn番目の要素を取得しようとしています。

私はこれまでに次のものを持っています。

SELECT regexp_substr(
   '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N',
   '[^,]+',
   1,
   7)
FROM dual;

しかし、要素が空の場合は機能しません。つまり、誰か助けてもらえますか?

4

4 に答える 4

5

区切り値が常にコンマの間に英数字である場合は、次のことを試してください。

SELECT REGEXP_SUBSTR( <delimied_string>, '[[:alnum:]]{0,},', 1, 7 )
  FROM dual;

7番目の値(末尾のコンマを含む)を取得します。空の場合は、末尾のコンマが表示されます(簡単に削除できます)。

明らかに、7番目以外の値が必要な場合は、4番目のパラメーター値を必要なn番目のオカレンスに変更します。

SELECT REGEXP_SUBSTR( <delimied_string>, '[[:alnum:]]{0,},', 1, <nth occurance> )
  FROM dual;

編集:私は正規表現が大好きなので、ここに末尾のコンマも削除するソリューションがあります

SELECT REPLACE(
          REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth>), 
          ','
       )
  FROM dual;

それが役に立てば幸い

于 2011-09-09T14:25:00.777 に答える
1

正規表現に固執しない限り、これも機能します。

WITH q AS (
SELECT '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' thestring FROM dual
)
SELECT SUBSTR(thestring, INSTR(thestring,',',1,6)+1, 
                         INSTR(thestring,',',1,7)-INSTR(thestring,',',1,6)-1) "The Element"
  FROM q;

The Element
------------------------
100000010892100000012655

別の可能性。データのソースが何であるかを指定していません。外部テーブルを使用して入力ソースを読み取り、SQLを介して処理できますか?

于 2011-09-09T15:12:54.590 に答える
1

ちょっとしたトリックでそれを行うことができます。最初にすべてのコンマをコンマに置き換え、その後にスペースを続け、その後、余分な先頭のスペースをスキップします。

SQL> with data as
  2  ( select '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' txt
  3      from dual
  4  )
  5  select regexp_substr(txt,'[^,]+',1,7)                             seventh_element_wrong
  6       , replace(txt,',',', ')                                      with_extra_space_after_comma
  7       , regexp_substr(replace(txt,',',', '),'[^,]+',1,7)           seventh_element_leading_space
  8       , substr(regexp_substr(replace(txt,',',', '),'[^,]+',1,7),2) the_seventh_element
  9    from data
 10  /

S WITH_EXTRA_SPACE_AFTER_COMMA
- ----------------------------------------------------------------------------------------------------------------------
SEVENTH_ELEMENT_LEADING_S THE_SEVENTH_ELEMENT
------------------------- ------------------------
1 100016154, 5101884LT00001, , , , , 100000010892100000012655, L, SEI, 5101884LT00001, 1, SL, 3595.03, 00, 2, N, N, G, N
 100000010892100000012655 100000010892100000012655

よろしく、
ロブ。

于 2011-09-09T14:42:09.860 に答える
0
SELECT rtrim(regexp_substr('100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N','[^,]{0,}[,]?',1,7),',')
FROM dual;
于 2013-10-22T14:40:36.540 に答える