SQLServer中的CONCAT_WS函数,此函数以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。 它会用第一个函数参数中指定的分隔符分隔连接的字符串值。 (CONCAT_WS 指示使用分隔符连接。)
适用于:
- Sql Server 2017 (14.x) 及更高版本
- Azure SQL 数据库
- Azure SQL 托管实例
- Microsoft Fabric
- Microsoft Fabric Warehouse 中的 Azure Synapse Analytics SQL 分析终结点
1、语法
CONCAT_WS ( separator , argument1 , argument2 [ , argumentN ] ... )
2、参数
separator
任何字符类型(char、nchar、nvarchar 或 varchar)的表达式。argument1, argument2 [ , argumentN ]
任意字符串值的表达式。 CONCAT_WS 函数需要至少两个自变量,并且不得超过 254 个自变量。
3、返回类型
长度和类型取决于输入的字符串值。
4、备注
CONCAT_WS 采用可变数量的字符串自变量,并将它们串联(或联接)成单个字符串。 它会用第一个函数参数中指定的分隔符分隔连接的字符串值。 CONCAT_WS 需要分隔符参数和两个其他字符串值参数的最小值,否则,CONCAT_WS 将引发错误。 CONCAT_WS 在串联前会将所有自变量隐式转换为字符串类型。
隐式转换为字符串的过程遵循现有的数据类型转换规则。 有关行为和数据类型转换的详细信息,请参阅 CONCAT (Transact SQL)。
https://learn.microsoft.com/en-us/sql/t-sql/functions/concat-transact-sql?view=sql-server-ver16
5、NULL 值处理方式
CONCAT_WS 忽略 SET CONCAT_NULL_YIELDS_NULL { ON | OFF } 设置。
如果 CONCAT_WS 接收到全部为 NULL 值的自变量,它将返回类型为 varchar(1) 的空字符串。
串联过程中 CONCAT_WS 会忽略 Null 值,并且不会在 null 值之间添加分隔符。 因此,CONCAT_WS 可以完全处理可能具有“空”值(例如,次要地址字段)的字符串串联。
如果方案涉及由分隔符分隔的 null 值,请考虑使用 ISNULL 函数。
6、示例
6.1、使用分隔符连接值
此示例串联 sys.databases 表中的三列,并使用前后空格的连字符 (-) 分隔这些值
SELECT database_id, recovery_model_desc, containment_desc,CONCAT_WS(' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;
-- 执行结果
database_id recovery_model_desc containment_desc DatabaseInfo
----------- ---------------------- ------------------ ------------------------
1 SIMPLE NONE 1 - SIMPLE - NONE
2 SIMPLE NONE 2 - SIMPLE - NONE
3 FULL NONE 3 - FULL - NONE
4 SIMPLE NONE 4 - SIMPLE - NONE
5 FULL NONE 5 - FULL - NONE
6 SIMPLE NONE 6 - SIMPLE - NONE(6 行受影响)
6.2、跳过 NULL 值
此示例忽略参数列表中的 NULL 值,并使用逗号分隔符值 (,)。
SELECT CONCAT_WS(',', '1 Microsoft Way', NULL, NULL, 'AdventureWorks2022', 'Sun', 8860) AS Address;
-- 执行结果
Address
-----------------------------------------------------
1 Microsoft Way,AdventureWorks2022,Sun,8860(1 行受影响)
6.3、从表生成 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
5,FULL,NONE
6,SIMPLE,NONE(1 行受影响)
6.4、用 ISNULL 函数包装可以为 null 的列,并提供默认值
CONCAT_WS 忽略 NULL 列中的值。 用 ISNULL 函数包装可以为 null 的列,并提供默认值。 例如:
SELECT TOP 5 CONCAT_WS(',', AddressID, ISNULL(AddressLine1, ''),ISNULL(AddressLine2, 'N/A'),City) AS AddressInfo
FROM Person.Address;
-- 执行结果
AddressInfo
-----------------------------------------------------------------------------------
532,#500-75 O'Connor Street,N/A,Ottawa
497,#9900 2700 Production Way,N/A,Burnaby
29781,00, rue Saint-Lazare,N/A,Dunkerque
24231,02, place de Fontenoy,N/A,Verrieres Le Buisson
19637,035, boulevard du Montparnasse,N/A,Verrieres Le Buisson(5 行受影响)