2017-06-16 12 views
1

Oracleで次の文字列を抽出したいと考えています。どうやってやるの?Oracleで文字列を抽出する方法

  • 元の文字列:011113584378(+) CARD, STAFF
  • 予想される文字列:私はあなたがPL/SQL関数を書くの贅沢を持っていると推定STAFF CARD
+3

入力から出力に行くロジックは何ですか?形式は常に SPACE <文字のシーケンス> COMMA SPACE <文字のシーケンス>ですか?文字列は常に空ではないのですか?それらは文字だけか、DASH( - )かUNDERSCORE(_)か数字を含むことができますか?あらゆる種類のコードを考える前に論理を明確にしてください。 – mathguy

答えて

0

?入力を解析するには、"SUBSTR"、または"INSTR"||concatenation operatorを使用してください。 、私は 'の値を返す必要があります。この場合、

F:\Siebfile\YD\S_SR_ATT_1-60SS_1-AM3L.SAF

https://www.techonthenet.com/oracle/questions/parse.php

...フィールドには次の値が含まれる場合があります。ここでは

は一例ですこれは3番目と4番目のアンダースコアの間にある値であるため、1-60SS 'となります。

SOLUTION:

create or replace function parse_value (pValue varchar2) 
    return varchar2 
is 
    v_pos3 number; 
    v_pos4 number; 

begin 

    /* Return 3rd occurrence of '_' */ 
    v_pos3 := INSTR (pValue, '_', 1, 3) + 1; 

    /* Return 4rd occurrence of '_' */ 
    v_pos4 := INSTR (pValue, '_', 1, 4); 

    return SUBSTR (pValue, v_pos3, v_pos4 - v_pos3); 

end parse_value; 
+4

SUBSTRとINSTRを使用するPL/SQL関数を書く必要があるのはなぜですか? – mathguy

0

[OK]を、私はかみますよ。この例では、REGEXP_REPLACEを使用して文字列を記述し、必要な部分を保存してから、文字列を戻す前に再配置します。この例があなたが提供した1行で動作することを保証することしかできないので、あなたが扱っているデータの実例をいくつか示した方が良いでしょう。

正規表現は、文字列の先頭から末尾のparen-spaceまでの任意の文字に一致します。コンマスペースを含まない文字の次のセットは、それらを括弧で囲むことによって "記憶"されます。これはキャプチャされたグループと呼ばれます。次にキャプチャされるグループは、そのカンマ区切り文字の後ろの文字の集合(行の終わり)(ドル記号)です。キャプチャされたグループは、左から右の順に参照されます。 3番目の引数は、返される文字列で、2番目と1番目のキャプチャされたグループがその順序で、スペースで区切られています。

SQL> with tbl(str) as (
    select '+011113584378(+) CARD, STAFF' from dual 
    ) 
    select regexp_replace(str, '^.*\) (.*), (.*)$', '\2 \1') formatted 
    from tbl; 

FORMATTED 
---------- 
STAFF CARD 

SQL> 
関連する問題