共用方式為


CONCAT_WS (Transact-SQL)

適用於: sql Server 2017 (14.x) 和更新版本的 Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric Warehouse Microsoft Fabric 中的 Azure Synapse Analytics SQL 分析端點

此函式會傳回透過以端對端方式串連 (或聯結) 兩個以上字串值所產生的字串。 它使用第一個函數引數中指定的分隔符號來分隔這些串連的字串值。 (CONCAT_WS 指出 與分隔符號的串連。)

語法

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

引數

separator

任何字元類型的表達式(charncharnvarcharvarchar)。

argument1argument2 [ , argumentN ]

任何字串值的表達式。 CONCAT_WS 函式需要至少兩個引數,而且不能超過 254 個引數。

傳回類型

長度和類型取決於輸入的字串值。

備註

CONCAT_WS 會採用可變數量的字串引數,並將其串連 (聯結) 成單一字串。 它使用第一個函數引數中指定的分隔符號來分隔這些串連的字串值。 CONCAT_WS 需要分隔符自變數和至少兩個其他字串值自變數;否則, 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 可以乾淨地處理可能有「空白」值 - 例如,第二個地址欄位的字串串連。 如需詳細資訊,請參閱 範例 B

如果案例牽涉到以分隔符分隔的 Null 值,請考慮 ISNULL 函式。 如需詳細資訊,請參閱 C 範例。

範例

A. 使用分隔符串連值

此範例會串連數據表中的sys.databases三個數據行,並以空格括住的連字元分隔值。-

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;