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 ] )

CONCAT_WS 関数の使い方と注意点 0

区切り文字には 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;

[実行結果]

CONCAT_WS 関数の使い方と注意点 1

@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;

[実行結果]

CONCAT_WS 関数の使い方と注意点 2

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;

[実行結果]

CONCAT_WS 関数の使い方と注意点 3


住所を Prefecture、City などカラムを分けて保存している時に、カンマ区切りでつなげて取得したい時などにも、CONCAT_WS 関数が使えます。

例えば、次のような Customer テーブルがあります。

SELECT  CustomerID,
        Prefecture,
        City,
        Address1,
        Address2
FROM    Customer
ORDER BY CustomerID;

[実行結果]

CONCAT_WS 関数の使い方と注意点 4


この Customer テーブル から Address2、Address1、City、Prefecture の順番で、カンマを入れた住所を取得したい時は次のようにできます。

SELECT  CustomerID,
        Prefecture,
        City,
        Address1,
        Address2,
        CONCAT_WS(', ', Address2, Address1, City, Prefecture) AS FullAddress
FROM    Customer
ORDER BY CustomerID;

[実行結果]

CONCAT_WS 関数の使い方と注意点 5

[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 関数の基本的な使い方から、実務で役立つ例、注意点などをご説明しました。

© 2010-2025 SQL Server 入門