2017-01-17 6 views
0

最後のスラッシュ「/」の後の任意の文字を無視して、削除するクエリに新しい列を作成するための最良の方法をOracle SQLで探します。&既存の列(部分文字列または正規表現)から新しい修正列を作成

大文字と小文字のステートメントを使用して新しい列(NEW_COL_1)を作成しますが、FROM COL1というテキストをフィルタリングする最適な方法はわかりません。下記の例を参照してください。

Col_1 | New_Col_1 
--------------------- 
abc/ab | abc 
a1/a1 | a1 
a1/a1/a2| a1/a1 
efg/a1/z| efg/a1 

答えて

0

regexp_substrを使用する方法の1つです。

select regexp_substr(col_1,'(.*)/.*$',1,1,null,1) as new_col_1 
from tablename 
where instr(col_1,'/') > 0 

(.*)/.*$は - 最初のグループとして、文字列の最後の/まで、すべての文字を取得し、それを抽出します。正規表現がなければ

1

、あなたが使用することができます:

with test(s) as (
    select 'abc/ab ' from dual union all 
    select 'a1/a1 ' from dual union all 
    select 'a1/a1/a2' from dual union all 
    select 'efg/a1/z' from dual union all 
    select 'efg'  from dual    /* no slash in the string */ 
) 
select s, substr(s, 1, 
         case /* to handle the case no slash exists in the string */ 
          when instr(s, '/', -1) = 0 then length(s) 
          else instr(s, '/', -1) -1 
         end 
       ) 
from test 

います:

abc/ab  abc 
a1/a1  a1 
a1/a1/a2 a1/a1 
efg/a1/z efg/a1 
efg efg 

INSTRは、スラッシュ(-1パラメータ)の最後の出現と、サブストリングを見つけるために使用されます必要に応じて文字列をトリムします。

これはMathguyの提案によると、以下のように、よりコンパクトに書き換えることができます。

select s, 
     case 
     when instr(s, '/') > 0 then substr(s, 1, instr(s, '/', -1) -1) 
     else s 
     end 
from test 

文字列の少なくともスラッシュは、単に、存在する場合ここでの考え方は、コール機能にありますスラッシュがない場合は文字列自体を返します。

+0

またはさえをINSTRは後方カウント/最初の位置を取得します、instr(...) - 1)else s end'。文字列にスラッシュがない場合は 'substr'と' length'コールを避けてください。 – mathguy

+0

@mathguy:読んだほうがはっきりしています。答えを投稿するのを待って – Aleksej

+0

Lol - いいえ、私はあなたの投稿を編集します(あなたの答えです、これはほんの小さな変更です)。あなたは仕事をさせるでしょう! (... OPの入力でスラッシュのない文字列が可能であるかどうかもわかりません) – mathguy

0

通常の文字列関数を使用するか、次に `Sを選択し、ケースINSTR(...)> 0のsubstr(s、1:

with data as 
(select 'abc/ab' as col1 from dual union all 
    select 'a1/a1' as col1 from dual union all 
    select 'a1/a1/a2' as col1 from dual union all 
    select 'efg/a1/z' as col1 from dual 
) 
select col1, instr(col1, '/',-1), substr(col1, 1, instr(col1, '/', -1) -1) from data 

結果:

COL1  INSTR(COL1,'/',-1) SUBSTR(COL1,1,INSTR(COL1,'/',-1) 
-------- ------------------ -------------------------------- 
abc/ab     4 abc 
a1/a1      3 a1 
a1/a1/a2     6 a1/a1 
efg/a1/z     7 efg/a1 
+1

すべての入力文字列に(OPのサンプル入力のように)少なくとも1つのスラッシュが含まれていればOKですが、スラッシュがない場合は機能しません。そのような場合には、それが彼/彼女のデータで可能であるかどうか少なくともOPに尋ねる価値がある。 – mathguy

+0

@mathguy。うん、良い点。スラッシュがない場合は、文字列をそのまま残すように関数を変更することができます。デコード(instr(col1、 '/'、-1)、0、col1、substr(col1,1、instr(col1、 '/ '、-1)-1)) – BobC

関連する問題