CONCAT_WS (Transact-SQL)
適用対象: SQL Server 2017 (14.x) 以降 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Microsoft Fabric のSQL 分析エンドポイント 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;