T-SQL - CONCAT_WS 関数の使い方と注意点:区切り文字を入れて文字列を結合する方法
CONCAT_WS 関数の使い方と注意点:区切り文字を入れて文字列を結合する方法
T-SQL で複数の文字列を結合するとき、文字と文字の間に区切り文字(セパレーター)を入れて結合したいことがあります。
そんなときに便利なのが、CONCAT_WS 関数です。
この記事では、CONCAT_WS 関数の基本的な使い方から、実務で役立つ例、注意点などをご説明します。
CONCAT_WS 関数の基本的な使い方
SQL Server の CONCAT_WS 関数は、区切り文字を入れて、複数の文字列を 1 つに結合するための T-SQL 関数です。
CONCAT の後ろについている WS というのは "With Separator" の略です。
SQL Server 2017 以降で使用可能です。
CONCAT_WS 関数の構文は以下の通りです。
CONCAT_WS ( 区切り文字, 引数1, 引数2 [, ..., 引数N ] )
区切り文字には CHAR、NCHAR、VARCHAR、NVARCHAR 型の文字列を指定します。
つなげる文字列の引数は、少なくとも 2 個は必須で、最大 254 個まで指定できます。
全ての引数を自動的に文字列型に変換し、前から区切り文字を入れながら結合して、ひとつの文字列を生成します。
引数に NULL が混ざった際の挙動については注意が必要ですので、後述します。
すべての引数が NULL の場合、CONCAT_WS 関数は NULL を返すのではなく、空の文字列 '' を返します。戻り値の型は NVARCHAR です。
それでは、CONCAT_WS 関数を使って、区切り文字入りで、文字列を結合してみましょう。
DECLARE @Value1 VARCHAR(5) = 'Test', @Value2 INT = 123, @Value3 NVARCHAR(5) = N'テスト'; SELECT CONCAT_WS(' - ', @Value1, @Value2, @Value3) AS ConcatWSResult;
[実行結果]
@Value1 は VARCHAR 型, @Value2 は INT 型, @Value3 は NVARCHAR 型で定義した変数です。
区切り文字として ' - ' と、これらの 3 つの変数を、CONCAT_WS 関数に渡すことで、前から区切り文字入りで結合した文字列を取得しています。
実行結果としては、 "Test - 123 - テスト" が得られています。
@Value2 は INT 型 ですが文字列に変換されて結合されています。
CONCAT_WS 関数の NULL の扱いについて
CONCAT_WS 関数を使う際に、少し注意が必要なのが、引数に NULL が混ざった時の挙動です。
CONCAT_WS 関数は、引数が NULL の時は、その値を区切り文字も入れずに完全にスキップします。
もしスキップされてしまっても問題ないケースであればいいですが、CSV を生成しようとしていて、カラムの位置に意味があるような場合は、スキップされないように ISNULL 関数で、NULL を空の文字列に置き換える必要があります。
例えば、次のような student テーブルの StudentID, LastName, FirstName, Gender をカンマ区切りでつなげたいとします。
以下のクエリーを student_id = 2 の LastName が NULL の状態で実行してみます。
SELECT StudentID, FirstName, LastName, Gender, CONCAT_WS(',', StudentID, LastName, FirstName, Gender) AS StudentInfo_ConcatWS1, CONCAT_WS(',', StudentID, ISNULL(LastName, ''), ISNULL(FirstName, ''), ISNULL(Gender, '')) AS StudentInfo_ConcatWS2 FROM Student ORDER BY StudentID;
[実行結果]
NULL をそのまま CONCAT_WS 関数でつなげた StudentInfo_ConcatWS1 では、student_id = 2 のデータは NULL が無視され、結合された文字列が「2,Hanako,F」になっています。
StudentInfo_ConcatWS2 では、NULL になる可能性のあるカラムの値を ISNULL 関数を使って、NULL の時は空の文字列に変換してから、CONCAT_WS 関数に渡しています。
StudentInfo_ConcatWS2 の student_id = 2 のデータは、結合された文字列が「2,,Hanako,F」になっています。
CONCAT_WS 関数の実務で役立つ使い方
先ほど student テーブルの FirstName と LastName をスペースを入れてつなげて、FullName としてレポート用などにつなげて表示したい時があるかもしれません。
そんな時は CONCAT_WS 関数を使って文字列を結合すると簡単で便利です。
この Student テーブルの StudentID と LastName と FirstName をつなげたい時は次のようにできます。
SELECT StudentID, LastName, FirstName, CONCAT_WS(' ', FirstName, LastName) AS FullName FROM Student ORDER BY StudentID;
[実行結果]
住所を Prefecture、City などカラムを分けて保存している時に、カンマ区切りでつなげて取得したい時などにも、CONCAT_WS 関数が使えます。
例えば、次のような Customer テーブルがあります。
SELECT CustomerID, Prefecture, City, Address1, Address2 FROM Customer ORDER BY CustomerID;
[実行結果]
この Customer テーブル から Address2、Address1、City、Prefecture の順番で、カンマを入れた住所を取得したい時は次のようにできます。
SELECT CustomerID, Prefecture, City, Address1, Address2, CONCAT_WS(', ', Address2, Address1, City, Prefecture) AS FullAddress FROM Customer ORDER BY CustomerID;
[実行結果]
[FullAddress] 1-1-1 Jinnan, Shibuya, Tokyo Grand Heights 302, 2-2-2 Umeda, Kita-ku, Osaka 3-3-3 Minato Mirai, Yokohama, Kanagawa 4-4-4 Sakae, Aichi
FullAddress として、CONCAT_WS 関数を使って結合した結果が取得できました。
カラムの値が NULL の時はスキップされて、住所が取得できていますね。
以上、CONCAT_WS 関数の基本的な使い方から、実務で役立つ例、注意点などをご説明しました。