対象者: SQL Server 2017 (14.x) 以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL Analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
この関数は、連結の結果、またはエンド ツー エンドの方法で 2 つ以上の文字列値の結合の結果の文字列を返します。 これらの連結文字列値を、最初の関数の引数に指定された区切り記号で区切ります。 (CONCAT_WS は "区切りを使用した連結" を示します。)
構文
CONCAT_WS ( separator , argument1 , argument2 [ , argumentN ] ... )
引数
separator
任意の文字型 (char、nchar、nvarchar、またはvarchar) の式です。
argument1、argument2、[ , argumentN ]
任意の文字列値の式。
CONCAT_WS 関数では、2 個以上、254 個未満の引数が必要です。
戻り値の型
長さと型を入力に依存する文字列値。
解説
CONCAT_WS は、文字列引数の可変数を取得して、1 つの文字列に連結 (または結合) します。 これらの連結文字列値を、最初の関数の引数に指定された区切り記号で区切ります。
CONCAT_WS には、separator 引数と、他の 2 つの文字列値引数の最小値が必要です。指定しないと、CONCAT_WS でエラーが発生します。
CONCAT_WS は連結する前に、すべての引数を文字列型に暗黙的に変換します。
文字列への暗黙の変換は、データ型変換の既存の規則に従います。 動作とデータ型変換について詳しくは、「CONCAT (Transact-SQL)」をご覧ください。
NULL 値の処理方法
CONCAT_WS は SET 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;