CONCAT_WS (Transact-SQL)

适用于:SQL Server 2017 (14.x) 及更高版本Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

此函数以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。 它会用第一个函数参数中指定的分隔符分隔连接的字符串值。 (CONCAT_WS 指示使用分隔符连接。)

语法

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

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

separator

任何字符类型(charncharnvarcharvarchar)的表达式。

argument1, argument2 [ , 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;