次のような結果を持つテーブル列があるとします。
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
上記のテーブルからこの列を選択し、アンダースコア(_)文字までの部分文字列のみを返すクエリを作成できるようにします。例えば:
ABC
DEFGH
IJKLMNOP
SUBSTRING関数は、位置ベースであり、アンダースコアの位置が異なるため、タスク次第ではないようです。
TRIM関数(具体的にはRTRIM関数)について考えました。
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
しかし、特定のリスト/文字セットのみを削除するように見えるため、これをどのように機能させるかはわかりませんが、実際にはアンダースコア文字に至る文字の後だけです。
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 で正規表現を使用できます。
これはREGEXP_SUBSTRを使用して簡単に実行できます。
使ってください
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)
STRING_EXAMPLEは文字列です。
試してください:
SELECT
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)
from dual
それはあなたの問題を解決します。
最初のアンダースコアの位置を取得し(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
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;
ホスト
別の可能性は、 REGEXP_SUBSTR。 の使用です
列内のすべての文字列にアンダースコアがない場合(または、null値が出力される場合)、これを覚えておいてください:
SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1),
"STRING_COLUMN")
AS OUTPUT FROM DUAL
大きな文字列からサブ文字列を見つけるには:
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