web-dev-qa-db-ja.com

Oracle SQLで特定の文字までの部分文字列を選択する方法は?

次のような結果を持つテーブル列があるとします。

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

上記のテーブルからこの列を選択し、アンダースコア(_)文字までの部分文字列のみを返すクエリを作成できるようにします。例えば:

ABC
DEFGH
IJKLMNOP

SUBSTRING関数は、位置ベースであり、アンダースコアの位置が異なるため、タスク次第ではないようです。

TRIM関数(具体的にはRTRIM関数)について考えました。

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

しかし、特定のリスト/文字セットのみを削除するように見えるため、これをどのように機能させるかはわかりませんが、実際にはアンダースコア文字に至る文字の後だけです。

70
Pretzel

SUBSTR、INSTR、およびNVL(アンダースコアのない文字列の場合)の組み合わせを使用すると、必要なものが返されます。

SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
  FROM DUAL

結果:

output
------
ABC

つかいます:

SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
  FROM YOUR_TABLE t

参照:

補遺

Oracle10g +を使用している場合、 REGEXP_SUBSTR で正規表現を使用できます。

128
OMG Ponies

これはREGEXP_SUBSTRを使用して簡単に実行できます。

使ってください

REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 

STRING_EXAMPLEは文字列です。

試してください:

SELECT 
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
from dual

それはあなたの問題を解決します。

36
user1717270

最初のアンダースコアの位置を取得し(INSTRを使用)、次にsubstrを使用して1文字目から(pos-1)までの文字列の一部を取得する必要があります。

  1  select 'ABC_blahblahblah' test_string,
  2         instr('ABC_blahblahblah','_',1,1) position_underscore,
  3         substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result
  4*   from dual
SQL> /

TEST_STRING      POSITION_UNDERSCORE RES
---------------- ------------------  ---
ABC_blahblahblah                  4  ABC

Instrドキュメント

Susbtr Documentation

7
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)  from dual

user1717270が投稿した正しい答えです

INSTRを使用すると、「_」が含まれていると想定される文字列の位置がわかります。そうでない場合はどうなりますか?答えは0です。したがって、文字列を印刷する場合は、NULLを印刷します。例:「Host.domain」からドメインを削除する場合。場合によっては、短い名前、つまり「ホスト」のみを持つことになります。ほとんどの場合、「ホスト」を印刷します。さて、INSTRを使用すると、「。」が見つからなかったため、NULLが返されます。つまり、0から0まで印刷されます。REGEXP_SUBSTRを使用すると、すべての場合:

SELECT REGEXP_SUBSTR('Host.DOMAIN','[^.]+',1,1)  from dual;

ホスト

そして

SELECT REGEXP_SUBSTR('Host','[^.]+',1,1)  from dual;

ホスト

6
Loquillo Amigo

別の可能性は、 REGEXP_SUBSTR。 の使用です

2
EvilTeach

列内のすべての文字列にアンダースコアがない場合(または、null値が出力される場合)、これを覚えておいてください:

SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), 
"STRING_COLUMN") 
AS OUTPUT FROM DUAL
0
SJOH

大きな文字列からサブ文字列を見つけるには:

string_value:=('This is String,Please search string 'Ple');

次に、'Ple'から文字列String_valueを見つけるには、次のようにします。

select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;

結果が見つかります:Ple

0
vishal Pathak