CONCAT_WS (Transact-SQL)

適用対象: SQL Server 2017 (14.x) 以降 Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

この関数は、連結の結果、またはエンド ツー エンドの方法で 2 つ以上の文字列値の結合の結果の文字列を返します。 これらの連結文字列値を、最初の関数の引数に指定された区切り記号で区切ります。 (CONCAT_WS は "区切りを使用した連結" を示します。)

構文

CONCAT_WS ( separator , argument1 , argument2 [ , argumentN ] ... )

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

separator

任意の文字型 (charncharnvarchar、またはvarchar) の式です。

argument1argument2、[ , argumentN ]

任意の文字列値の式。 CONCAT_WS 関数では、2 個以上、254 個未満の引数が必要です。

戻り値の型

長さと型を入力に依存する文字列値。

解説

CONCAT_WS は、文字列引数の可変数を取得して、1 つの文字列に連結 (または結合) します。 これらの連結文字列値を、最初の関数の引数に指定された区切り記号で区切ります。 CONCAT_WS には、separator 引数と、他の 2 つの文字列値引数の最小値が必要です。指定しないと、CONCAT_WS でエラーが発生します。 CONCAT_WS は連結する前に、すべての引数を文字列型に暗黙的に変換します。

文字列への暗黙の変換は、データ型変換の既存の規則に従います。 動作とデータ型変換について詳しくは、「CONCAT (Transact-SQL)」をご覧ください。

NULL 値の処理方法

CONCAT_WSSET CONCAT_NULL_YIELDS_NULL { ON | OFF } 設定を無視します。

CONCAT_WS はすべて NULL 値の引数を受け取ると、varchar(1) 型の空の文字列を返します。

CONCAT_WS は連結時に null 値を無視し、null 値間に区切りを追加しません。 そのため、CONCAT_WS は値が空の文字列、たとえば 2 つ目のアドレス フィールドの連結を適切に処理できます。 詳細については、例 B を参照してください。

区切り記号で区切られた null 値があるシナリオの場合は、ISNULL 関数の使用を検討してください。 詳細については、例 C を参照してください。

A. 区切りで値を連結する

この例では、値をスペースで囲まれたハイフン (sys.databases) で区切って、- テーブルの 3 つの列を連結します。

SELECT CONCAT_WS(' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;

結果セットは次のようになります。

DatabaseInfo
-----------------
1 - SIMPLE - NONE
2 - SIMPLE - NONE
3 - FULL - NONE
4 - SIMPLE - NONE

B. Null 値をスキップする

次の例は、引数リストの NULL 値を無視し、コンマ区切り値 (,) を使用します。

SELECT CONCAT_WS(',', '1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;

結果セットは次のようになります。

Address
--------------------------------
1 Microsoft Way,Redmond,WA,98052

C: テーブルから CSV 形式のデータを生成する

この例では、区切り値としてコンマ (,) を使用し、復帰文字 CHAR(13) を追加して、結果セットの列区切り値形式にします。

SELECT STRING_AGG(CONCAT_WS(',', database_id, recovery_model_desc, containment_desc), CHAR(13)) AS DatabaseInfo
FROM sys.databases;

結果セットは次のようになります。

DatabaseInfo
-------------
1,SIMPLE,NONE
2,SIMPLE,NONE
3,FULL,NONE
4,SIMPLE,NONE

CONCAT_WS は列 NULL の値を無視します。 ISNULL 関数を使用して null 許容の列をラップし、既定値を指定します。 次に例を示します。

SELECT STRING_AGG(
    CONCAT_WS(',', database_id, ISNULL(recovery_model_desc, ''),
    ISNULL(containment_desc, 'N/A')
    ), CHAR(13)) AS DatabaseInfo
FROM sys.databases;