SQLServer 2017でTRIM関数が追加されました。
以前はLTRIM関数とRTRIM関数しかなかったので、文字列の左右(前後)の空白文字 CHAR(32) を取り除くには、LTRIM関数で左(前)の空白文字を削除して、さらにRTRIM関数で右(後)の空白文字を削除する(または、RTRIM関数で右(後)の空白文字を削除して、LTRIM関数で左(前)の空白文字を削除する)必要がありました。
なぜ今まで実装されなかったのかが不思議ですが、ようやくTRIM関数が使えるようになり、1つの関数で左右(前後)の空白文字を削除することが可能になりました。
また、TRIM関数は、LTRIM関数、RTRIM関数ではできなかった削除する文字の指定もできるようになりました。
今回はTRIM関数の使い方について紹介します。
目次
SQL Server 2017 の新機能 TRIM関数
SQLServer 2017でTRIM関数が追加されたので、文字列の左右(前後)の空白文字を削除する処理が1つの関数で済むようになり、とても便利になりました。
TRIM関数を使うことで、LTRIM関数とRTRIM関数の重ね掛けを行っていた処理が不要になったのです。
TRIM関数が登場する前
TRIM関数がなかった頃は、以下のようなSQLを記述して左右(前後)の空白文字を削除していました。
1 2 3 4 5 6 |
// 前(左)に半角スペースが2つ、後(右)に半角スペースが1つある文字列 DECLARE @string nvarchar(10) = ' abcde '; -- LTRIM関数とRTRIM関数で左右(前後)の空白文字を削除 SELECT LTRIM(RTRIM(@string)) AS RESULT; -- 実行結果:「abcde」 |
TRIM関数の登場後
TRIM関数が追加されたので上記のSQLは次のように記述することができるようになりました。
1 2 3 4 5 6 |
// 前(左)に半角スペースが2つ、後(右)に半角スペースが1つある文字列 DECLARE @string nvarchar(10) = ' abcde '; -- TRIM関数で左右(前後)の空白文字を削除 SELECT TRIM(@string) AS RESULT; -- 実行結果:「abcde」 |
TRIM関数は、LTRIM関数、RTRIM関数と同様に、引数に空白文字を含んだ文字列を指定すれば、空白文字を削除した文字列を返してくれます。
LTRIM関数 RTRIM関数には無い TRIM関数の新機能
TRIM関数では、LTRIM関数、RTRIM関数ではできなかった処理を行うことができるようになりました。
削除する文字列を指定できる
LTRIM関数、RTRIM関数では空白文字「半角スペース: CHAR(32)」しか削除することができませんでしたが、TRIM関数では削除する文字列を指定が可能になったので、全角スペースや改行文字、タブ文字なども削除することができるようになりました。
以下に全角スペースを削除する例を示します。
1 2 3 4 5 6 |
-- 左右(前後)に全角スペースがある文字列 DECLARE @string nvarchar(10) = ' あいうえお '; -- TRIM関数で全角スペースを削除 SELECT TRIM(' ' FROM @string); -- 実行結果:「あいうえお」 |
削除する文字列を指定する場合は、少し特殊な指定方法になります。普通に考えると第1引数に空白文字を含んだ文字列を指定して、第2引数に変換する文字列を指定するように思いますが、TRIM関数では引数は1つしか指定できません。ですので、TRIM関数の引数には変換する文字列を指定した後にFROMキーワードを使用して空白文字を含んだ文字列を指定します。
TRIM(‘空白などの変換する文字列’ FROM ‘空白などを含んだ文字列’)
上記のように記述することで、TRIM関数は指定した文字列を削除した文字列を返してくれます。
複数の文字列を1度に削除できる
TRIM関数にはLTRIM関数、RTRIM関数ではできなかった機能がもう1つあります。
それが1度の変換で複数の文字を削除する機能です。
この機能を使うことで、例えば「半角スペース」と「全角スペース」や、「CR:キャリッジリターン(\r)」と「LF: ラインフィード(\n)」(「CHAR(13) + CHAR(10)」)を削除することができます。
次の例では、削除する文字を含む文字列から「半角スペース」「全角スペース」「タブ文字」「改行文字」を1度のTRIM関数で削除しています。
1 2 3 4 5 6 7 8 9 |
-- 削除する文字を含む文字列 DECLARE @string nvarchar(20) = ' ' + ' ' + ' ' + ' ' + 'かきくけこ' + ' ' + ' ' + ' ' + ' '; -- TRIM関数で全角スペースを削除 SELECT TRIM(' ' + CHAR(9) + CHAR(13) + CHAR(10) FROM @string); -- 実行結果:「かきくけこ」 |
削除する文字をすべてつなげた1つの文字列を引数に指定して、FROMキーワードで削除する文字を含む文字列を指定します。
上記の例では空白文字、タブ文字、改行文字を指定しましたが、TRIM関数では空白文字やタブ文字以外の任意の文字を削除することができます。
1 2 3 4 5 6 7 |
-- 削除する文字を含む文字列 DECLARE @string nvarchar(30) = '<#".:あイウ漢abcdefghijklmn+=;-/わヲン字'; -- TRIM関数で全角スペースを削除 SELECT TRIM('<#".:+=;-/あわイヲウン漢字' FROM @string); -- 実行結果:「abcdefghijklmn」 |
まとめ
SQLServer 2017で追加されたTRIM関数についてご紹介しました。
最後にTRIM関数の構文と使い方をおさらいしておきます。
1 2 3 4 5 |
-- TRIM関数の構文 TRIM ( [ characters FROM ] string ) ) -- characters: 削除したい文字 -- string: 削除する文字を含んだ文字列 |
charactersには、削除する必要がある文字を含む LOB 以外の任意の文字型 (nvarchar、varchar、nchar、またはchar) のリテラル、変数、または関数呼び出しが指定できます。
stringには、文字を削除する必要がある任意の文字型 (nvarchar、varchar、nchar、またはchar) の式が指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DECLARE @string nvarchar(20); SET @string = = ' ' + ' ' + ' ' + ' ' + '空白文字やタブ文字を含む文字列' + ' ' + ' ' + ' ' + ' '; -- 空白文字 CHAR(32) を削除する場合 SELECT TRIM(@string); -- 削除する文字に文字を指定して削除する場合 -- 指定文字: 全角スペース SELECT TRIM(' ' FROM @string); -- 削除する文字に複数の文字を指定して削除する場合 -- 指定文字: 空白文字、タブ文字、改行文字 SELECT TRIM(' ' + CHAR(32) + CHAR(9) + CHAR(13) + CHAR(10) FROM @string); |
削除する文字を含んだ文字列のみ指定した場合は、空白文字 CHAR(32)(半角スペース)が文字列の左右(前後)から削除されます。
削除する文字を指定してFROMキーワードの後に削除する文字を含んだ文字列を指定した場合は、指定した文字が文字列の左右(前後)から削除されます。
Microsoftのヘルプによると、Azure Synapse (以前の Azure SQL Data Warehouse) では削除する文字の指定はできないようで、以下の構文を使うことになるみたいです。
1 2 3 4 |
-- Azure Synapse (Azure SQL Data Warehouse) の構文 TRIM ( string ) -- string: 削除する文字を含んだ文字列 |
TRIM関数が追加されたことでTransact-SQLでの空白文字の削除が簡単になりました。個人的にはTRIM関数での削除する文字の指定方法を第2引数で指定する形式
TRIM(‘空白などを含んだ文字列’, ‘空白などの変換する文字列’)
1 2 |
-- 削除する文字列に全角スペースを指定した例 SELECT TRIM(' abcde ', ' ') AS RESULT; |
にしてほしかったかなと思います。また、LTRIM関数、RTRIM関数でも全角スペースなどの変換する文字列を指定できる仕様にしてほしいと思います。(次のSQL ServerのバージョンではLTRIM関数、RTRIM関数でも変換文字列を指定できるようになるいるかもしれません。)