SQL Serverではよく”LTRIM(RTRIM(文字列))”というのを見かけますが、なんでTRIMを使わないのでしょうか?
SQL Serverでは2017年のアップデートまでTRIM関数というものが実装されていませんでした。現在は使えるようになっています。
以前のSQL ServerではTRIM関数は実装されておらず、代わりにLTRIMとRTRIMを組み合わせて使用することで解決していました。
しかしSQL Server 2017の新機能でついにTRIM関数が実装されましたので、今回はこのTRIM関数について解説してみたいと思います。
新機能が実装されてから既に何年か経っているのでもうご存じの方も多いとは思いますが、TRIM関数の実装を知らなかった人やこれから学習を始める人は必見です!
TRIM関数の使い方
TRIM関数はスペース(空白)並びに指定した文字を文字列の前後から削除する場合に使用します。
SQL ServerでTRIM関数を使用する場合には次のように記述します。
// TRIM関数実装以前のSQL Server LTRIM(RTRIM([ 文字列 ])) // 文字列の前後からスペース(空白)を削除したい場合 TRIM([ 文字列 ]) // 文字列の前後から指定した文字を削除したい場合 TRIM([[ 削除したい文字 ] FROM ] [ 文字列 ])
基本的には「TRIM([ 文字列 ])」という形で使いますが、オプショナル項目を指定することによって任意の文字を削除することが出来ます。
オプショナル項目を指定する場合には、「FROM [ 文字列 ]」という形で文字列を指定します。
また削除したい文字が複数個存在する場合には、同時に指定することも可能です。この時、削除したい文字の順番は関係ありません。
それでは実際にコードで見てみましょう。
1> DECLARE @input NVARCHAR(MAX) = ' AB,CD, EFG '; 2> 3> SELECT '|' + TRIM(@input) + '|' AS Result; 4> GO Result ------------- |AB,CD, EFG|
まず基本構文を使って結果を表示してみました。
DECLAREを使って「@input」に「(半角スペース5個)AB,CD, EFG(半角スペース3個)」を代入しています。
基本構文ではTRIM関数に削除したい文字を未指定のまま文字列のみを指定しています。
こうすることで、文字列の両側から半角スペースが削除されます。
結果でも、文字列の両側から半角スペースが削除されていることが確認できると思います。
削除したい文字を複数指定する場合
次は削除したい文字を指定してみます。
1> DECLARE @input NVARCHAR(MAX) = ' AB,CD, EFG '; 2> 3> SELECT '|' + TRIM('AG ' FROM @input) + '|' AS Result1, 4> '|' + TRIM('AG' FROM @input) + '|' AS Result2; 5> GO Result1 Result2 --------------------- --------------------- |B,CD, EF| | AB,CD, EFG |
まず3行目のResult1では、TRIM関数のオプショナル項目(削除したい文字)に「A」「G」「 (半角スペース)」を指定しています。
4行目のResult2ではTRIM関数のオプショナル項目(削除したい文字)から敢えてスペース(空白)を外し、「A」「G」のみ指定しました。
結果を見てみると、Result1では@inputから半角スペースが削除された後で「A」「G」が削除されています。
しかしResult2では、スペース(空白)を指定しなかったことで「A」「G」が@inputの両端とはなっていない為、何も削除されることなくそのまま表示されていることが確認できます。
全角スペースを削除する
TRIM関数はオプショナル項目の指定が可能なため、LTRIM及びRTRIMではトリムが不可能だった全角スペースもトリムすることが出来ます。
早速コードと結果を見てみましょう。
1> DECLARE @input NVARCHAR(MAX) = ' Trim Sample '; 2> 3> SELECT '|' + LTRIM(RTRIM(@input)) + '|' AS Result1, 4> '|' + TRIM(' ' FROM @input) + '|' AS Result2; 5> GO Result1 Result2 ------------------- ------------------- | Trim Sample| |Trim Sample|
上のコードは、DECLAREで変数”@input”にセットされた「(全角スペース3個)Trim Sample(半角スペース2個)」に対し、RTRIMとTRIM関数でどのように表示されるかを比較しています。
LTRIMとRTRIMではオプショナル項目が指定できない為、「LTRIM(RTRIM(@input))」としてスペース(空白)をトリムするしかありません。
しかしこれら二つの関数は文字コードが”CHAR(32)”のスペース(空白)しかトリム出来ない為、@inputに代入された文字列の全角スペースがそのまま残っていることが確認できます。
一方TRIM関数を使った方法では、キチンと半角スペースもトリムされた文字列が返されています。
以前の方式で全角スペースをトリムする方法
今ではもう使われることはありませんが、2017アップデートでTRIM関数が実装されるまでのSQL Serverではどのようにして全角スペースをトリムしていたのでしょうか?
答えは次の通りです。
1> DECLARE @input NVARCHAR(MAX) = ' Trim Sample '; 2> 3> SELECT '|' + RTRIM(LTRIM(replace(@input, ' ', ' '))) + '|' AS Result; 4> GO Result -------------- |Trim Sample|
まず「LTRIM(RTRIM(@input))」を使うところまでは先ほどのコードと一緒です。
しかしこの方法では全角スペースがトリム出来ない為、まず最初に”replace”で@inputに代入されている文字列の全角スペースを半角スペースに置き換えます。
それから後にLTRIMとRTRIMを組み合わせた関数を使用しますが、こうしてみるとTRIM関数と比べ、非常に冗長なコードとなってしまうことがわかります。
また括弧内に複数の括弧をネストする形となっているため、非常に解り難い構造です。
この結果から、TRIM関数の実装でSQL Serverにおけるトリムがどれほど楽になったかがうかがえます。
まとめ
今回はSQL Serverに2017から実装された「TRIM関数」について解説してみましたがいかがでしたか?
今までなぜSQL ServerだけTRIM関数が実装されていなかったのか?
その理由は不明ですが、現在は既に実装済みですし、実装当初はAnywhereのバージョンではトリムできなかった全角スペースについても、今現在ではトリム出来るように仕様が変更されています。
構文自体も難しくない非常にシンプルなものとなっているので、この記事を読んでTRIM関数を使いこなせるように学習しましょう。