TRIM関数【ORACLE MASTER Silver SQL試験勉強】

TRIM関数備忘録記事アイキャッチ データベース

Ping-tで問題集解いていて、躓いたところがあったので備忘録です。

※Ping-tを利用するには会員登録が必要です。

今回は文字列の前後を切り取るTRIM関数について書いていきます。Ping-tの問題ID:26873で引っかかりました。

この記事で分かること
  • TRIM関数の使い方
  • Oracle SQLにおいての注意点

※関数の動作については、ブラウザでOracleのSQLを実行できるlivesql.oracle.comで試しています。

TRIM関数の使い方

TRIM関数の基本構文は以下です。

TRIM([ LEADING | TRAILING | BOTH ] [削除文字] FROM 対象文字列)

※Oracleは削除対象に2文字以上指定できないので、「削除文字列」ではなく「削除文字」としています。

具体的に見ていきましょう。

とりあえず、「*サンプル文字列*」という文字列があるとします。この前後にある「*」を取り除きたいです。

TRIM関数は、こういう「前後にある装飾とか取っ払いたいよ!」みたいな時に使います。
※記号だけでなく、「サ」とか「列」とかの文字も指定できます。

実行例は以下のような感じです。

TRIM関数実行結果
SELECT TRIM('*' FROM '*サンプル文字列*') AS 出力結果 FROM DUAL;

livesql.oracle.comにてこのように打ち込んだところ、出力結果は「サンプル文字列」となりました。前後の「*」が消えましたね。

また、対象文字列の前後に、削除文字が何個連なっていても全消しします。

たとえば「***サンプル文字列********」みたいになっていても、「*」を指定したら出力結果は「サンプル文字列」です。

TRIM関数実行結果

注意するポイント

端っこから数えて判断する

TRIM関数は、「対象文字列の先頭、あるいは末尾から調べて、削除文字がどれだけ連続しているか」で判定して削除します。

つまり、先頭、あるいは末尾に削除文字がないと削除はされません。

また、削除文字の途中で別の文字が入っていたりすると、そこで削除は止まります。

つまり、「$**サンプル文字列***$***」みたいな文字列でTRIM関数を使って「*」を消そうとすると、以下のような出力結果になります。

TRIM関数実行結果

「$**サンプル文字列***$」となっていますね。この結果から、「端っこから数えて、連鎖する分だけ削除している」ということが分かります。

Oracleでは、2文字以上指定したらエラーになる

ここがPing-tで引っかかったところなんですが、Oracleの仕様として、削除文字に2文字以上を指定したらエラーになります。

たとえば「$*サンプル文字列*」の先頭にある「$*」を取り除きたいからと言って、削除文字に「$*」と入れてしまうとエラーになります。

TRIM関数実行結果

エラーメッセージ …… ORA-30001:trim set should have only one character

ちなみに、MySQLで同じSQL実行してみましたが、普通に通りました。

MySQLでのTRIM関数実行結果

「$*サンプル文字列*」のうち、削除文字に指定された「$*」と合致する先頭部分だけ削除され、「サンプル文字列*」と出力されています。

他の環境はともかく、Oracleは2文字以上指定したらエラーです! 注意しましょう。

位置指定オプション(LEADING / TRAILING / BOTH)の使い方

TRIM関数では、削除文字を取り除く「位置」を明示的に指定することができます。

LEADING(先頭・左側のみ削除)

LEADINGを指定すると、文字列の先頭(左側)にある削除文字だけを取り除きます。末尾にある削除文字は無視されます。

SELECT TRIM(LEADING '*' FROM '*サンプル文字列*') AS 出力結果 FROM DUAL;
TRIM関数実行結果

出力結果は「サンプル文字列*」となり、先頭の「*」だけが消え、末尾の「*」は残ります。

TRAILING(末尾・右側のみ削除)

TRAILINGを指定すると、文字列の末尾(右側)にある削除文字だけを取り除きます。先頭にある削除文字は無視されます。

SELECT TRIM(TRAILING '*' FROM '*サンプル文字列*') AS 出力結果 FROM DUAL;
TRIM関数実行結果

出力結果は「*サンプル文字列」となり、末尾の「*」だけが消え、先頭の「*」は残ります。

BOTH(両端から削除)

BOTHを指定すると、先頭と末尾の両方から削除文字を取り除きます。

※オプションを省略した場合は、これがデフォルト値として指定されています。

SELECT TRIM(BOTH '*' FROM '*サンプル文字列*') AS 出力結果 FROM DUAL;
TRIM関数実行結果

出力結果は「サンプル文字列」となり、前後の「*」が両方とも消えます。

まとめ

以上、TRIM関数についての備忘録でした。

とにかく、「OracleのTRIM関数は、削除文字を2文字以上指定したらエラー!」ということを頭に入れて学習に励みます。

コメント

タイトルとURLをコピーしました