SQL ServerのTRIM関数は、文字列から先頭と末尾の空白を削除するように設計されています。先頭のスペースは、実際の文字列の前にある空白です。末尾のスペースは後に発生します。
この記事では、TRIM関数を調べ、実際の例でその使用法を説明します。それでは、基本から始めましょう。
SQLServerのTRIM関数
SQL TRIMは、文字列の両側にある不要な文字を1回のアクションでトリミングできる組み込み関数です。ほとんどの場合、空白を削除するために使用します。この関数はSQLServer2017に登場し、現在はAzureSQLデータベースにも存在しています。
SQLTRIM関数の構文は次のとおりです。
TRIM([文字FROM]文字列)
- 文字FROM オプションです 削除する文字を定義するパラメーター。デフォルトでは、このパラメータは文字列の両側のスペースに適用されます。
- 文字列 必須です スペースやその他の不要な文字を取り除く必要がある文字列を決定するパラメータ。
返される出力は、最初と最後でトリミングされると判断した文字を含まない文字列です。例を参照してください:
SELECT TRIM( ' example ') AS Result;
出力は次のとおりです。
例
前述したように、TRIM関数は他の文字も削除できます。不要な文字やスペースから文字列を削除する例を見てください:
SELECT TRIM( '.,# ' FROM '# ! example .') AS Result;
出力は次のとおりです。
!例
SQL TRIM関数は、バージョン2017以降のSQL Serverで使用できますが、そのリリースより前にタスクを実行することもできました。ユーザーはSQLLTRIMを適用できます およびSQLRTRIM 関数。これらは、サポートされているすべてのバージョンのSQLServerに存在します。
SQLServerのLTRIM関数
SQL LTRIM 関数は、文字列の左側にある不要なスペースを削除するのに役立ちます。構文は次のとおりです。
LTRIM(文字列)
文字列 は、左側でトリミングする必要のある文字のターゲット文字列を指定する必須パラメータです。出力は指定された文字列のコピーですが、先頭にスペースはありません:
SELECT LTRIM(' SQL Function');
出力:
「SQL関数」
SQLServerのRTRIM関数
SQL RTRIM 関数はLTRIMと同じように機能します。違いは、文字列の右側のスペースを削除することです。構文は次のとおりです。
RTRIM(文字列)
文字列 末尾のスペースを削除する必要がある文字列を指す必須パラメータです。
SELECT RTRIM('SQL Server ');
出力:
「SQLServer」
LTRIMとRTRIMを一緒に使用する
SQL Serverを使用する場合、文字列の片側だけからスペースを削除する必要があることがよくあります。それでも、両側の文字列をクリアする必要がある場合があります。前に説明したTRIM関数はその目標を果たしますが、覚えているように、SQLServer2017以降でのみ使用できます。
TRIM関数を使用せずに、1つの文字列の先頭と末尾の両方のスペースを削除する方法はありますか?はい。 LTRIMとRTRIMを1つのクエリで一緒に使用できます。
構文は次のとおりです。
LTRIM(RTRIM(string))
文字列 両側の不要なスペースからクリアしたい文字のターゲット文字列を定義します。 LTRIMとRTRIMを任意の順序で配置できることにも注意してください。 。
SELECT LTRIM(RTRIM(' SQL Server '));
出力:
「SQLServer」
これらすべてのSQL関数(TRIM、LTRIM、およびRTRIM)の本質を明らかにしたので、さらに深く掘り下げてみましょう。
空白が重要な理由
そのようなスペースを削除することがなぜ重要なのかと疑問に思うかもしれません。簡単に言えば、たとえば値を比較するときに、それらが迷惑になる可能性があるためです。空白自体が文字列の一部であると見なされるため、このような問題に注意することをお勧めします。
これらの機能を正しく調べてみましょう。
まず、企業で実行されるデータベースタイプの単純なテーブルを作成します。テーブルには3つの列があります。 1つ目は、各行を一意に識別するために必要なID列です。 2つ目はDBTypeNameA 。 3つ目はDBTypeNameB 。
最後の2つの列は、データ型によって異なります。 DBTypeNameA 最初にVARCHARを使用します データ型、および DBTypeNameB CHARを使用します データ型。
両方の列に、50のデータ長を割り当てます。
- Listing 1: Create a Simple Table
USE DB2
GO
CREATE TABLE DBType (
ID INT IDENTITY(1,1)
,DBTypeNameA VARCHAR (50)
,DBTypeNameB CHAR (50))
GO
これらのデータ型の違いに注意してください。
- VARCHAR列の場合、SQLServerは列abinitioで期待される50文字のスペースを割り当てません。コラムは最大の準備をする必要があると言います 50文字ですが、必要に応じてスペースを割り当てます。
- CHAR列の場合、実際の値にそのスペースが必要かどうかに関係なく、行が挿入されるたびに50文字がプロビジョニングされます。
したがって、VARCHAR(可変文字)を使用すると、スペースを節約できます。
テーブルを作成した後、リスト2のコードを使用して同じものを入力します。
-- Listing 2: Populate the Table
USE DB2
GO
INSERT INTO DBType VALUES ('SQL Server','SQL Server');
INSERT INTO DBType VALUES (' SQL Server ',' SQL Server ');
INSERT INTO DBType VALUES (' SQL Server ',' SQL Server ');
INSERT INTO DBType VALUES ('Oracle','Oracle');
INSERT INTO DBType VALUES (' Oracle ',' Oracle ');
INSERT INTO DBType VALUES (' Oracle ',' Oracle ');
INSERT INTO DBType VALUES ('MySQL','MySQL');
INSERT INTO DBType VALUES (' MySQL ',' MySQL ');
INSERT INTO DBType VALUES (' MySQL ',' MySQL ');
テーブルにデータを入力している間、先頭と末尾にスペースを入れて意図的に値を入力しました。デモで使用します。
テーブルをクエリすると(リスト3を参照)、SSMSでレンダリングされたデータに「歪み」が見られます(図1)。
-- Listing 3: Query the Table
USE DB2
GO
SELECT * FROM DBType;
この歪みは、先頭にスペースがあるために表示されます。末尾のスペースは、この方法で視覚化するのがより困難です。
リスト4のクエリは、この「歪み」の詳細を示しています。 LEN関数とDATALENGTH関数を紹介します:
- LEN()は、末尾のスペースを除く文字列の文字数を返します。
- DATALENGTH()は、式を表すために使用されるバイト数を返します。
-- Listing 4: Query the Table
USE DB2
GO
SELECT DBTypeNameA
, LEN(DBTypeNameA) LenVarcharCol
, DATALENGTH(DBTypeNameA) DataLenVarcharCol
, DBTypeNameB
, LEN(DBTypeNameB) LenCharCol
, DATALENGTH(DBTypeNameB) DataLenCharCol
FROM DBType;
図2は、先頭と末尾のスペースによる「SQL Server」、「Oracle」、「MySQL」などの式の長さの変化を示しています。
これは、SQL Serverクエリエンジンに関する限り、これらの式が同じではないことを意味します。リスト5のコードを実行すると、これを明確に確認できます。
-- Listing 5: Query for Specific
USE DB2
GO
SELECT * FROM DBType WHERE DBTypeNameA='SQL Server';
SELECT * FROM DBType WHERE DBTypeNameA='Oracle';
SELECT * FROM DBType WHERE DBTypeNameA='MySQL';
DataLenCharCol フィールドは、CHAR列のDATALENGTH()関数の出力を表します。したがって、「SQLServer」と「SQLServer」の間のこの不一致の結果の1つは、図3に表示されるクエリ結果です。
データベースタイプごとに3つの行がありますが、先頭と末尾のスペースで値が区別されるため、クエリはそれぞれ1つだけを返します。
問題の解決
リスト5のクエリの正しい結果を取得することは、実行可能で簡単です。リスト6に示すように、SQL ServerのTRIM()関数が必要です。
-- Listing 6: Query for Specific
USE DB2
GO
SELECT * FROM DBType WHERE TRIM(DBTypeNameA)='SQL Server';
SELECT * FROM DBType WHERE TRIM(DBTypeNameA)='Oracle';
SELECT * FROM DBType WHERE TRIM(DBTypeNameA)='MySQL';
このTRIM()関数がないと、一部のシナリオで間違った結果が得られる可能性があります。
問題を永続的に解決したいと仮定して、データを別のテーブルにロードすることで、これをさらに進めることができます(ある種のデータクリーンアップ)。
-- Listing 7: Query for Specific
USE DB2
GO
SELECT ID, TRIM(DBTypeNameA) DBTypeNameA, TRIM(DBTypeNameB) DBTypeNameB FROM DBType;
リスト7(図5)の結果をリスト3(図1)の結果と比較します。この結果セットを使用して別のテーブルを作成し、データをクリーンアップすることもできます(リスト8を参照)。
-- Listing 8: Create a New Table (Data Cleanup)
USE DB2
GO
SELECT ID, TRIM(DBTypeNameA) DBTypeNameA, TRIM(DBTypeNameB) DBTypeNameB INTO DBType_New FROM DBType;
SELECT * FROM DBType_New;
このようにして、問題を永続的に解決し、テーブルからデータを抽出する必要があるたびに関数を実行するオーバーヘッドを取り除くことができます。
結論
SQL ServerのTRIM()関数を使用して、文字列から先頭と末尾の両方のスペースを削除できます。 LTRIMとRTRIMは、この関数の2つのバリエーションであり、それぞれ先頭(LEFT)スペースと末尾(RIGHT)スペースに焦点を当てています。
TRIM()をオンザフライで適用して、結果セットを整理し、正しい結果セットを確実に取得できます。また、これを使用して、あるテーブルから別のテーブルにデータをきれいに移動しながら、スペースを削除することもできます。
関連記事
SQL SUBSTRING()関数を使用してプロのように文字列を解析する方法は?