SQLServer2017新特性CONCAT_WS函数返回从串联或联接的两个或更多字符串值生成的字符串

news/2024/11/28 12:44:44/

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
任何字符类型(charnchar、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 行受影响)

http://www.ppmy.cn/news/1550618.html

相关文章

mapstruct DTO转换使用

定义一个基础接口 package com.example.mapstruct;import org.mapstruct.Named;import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; import java.util.List;/*** Author zmn Dat…

RabbitMQ 单机与集群部署教程

目录 RabbitMQ 单机与集群部署教程第一部分:RabbitMQ 概述第二部分:RabbitMQ 单机部署教程1. 安装 RabbitMQ1.1 安装依赖项1.2 安装 RabbitMQ1.3 验证安装2. 配置 RabbitMQ2.1 配置环境变量2.2 启用 Web 管理插件2.3 创建用户与虚拟主机3. 单机案例代码实现(Python)4. 常见…

Git 进程占用报错-解决方案

背景 大仓库,由于开发者分支较多,我们在使用 git pull 或 git push 等命令时(与远端仓库交互的命令),不知之前配置了什么,我的电脑会必现以下报错(有非常长一大串报错-不同分支的git进程占用报…

【微服务】SpringBoot 整合Redis Stack 构建本地向量数据库相似性查询

目录 一、前言 二、向量数据库介绍 2.1 什么是向量数据库 2.2 向量数据库特点 2.3 向量数据库使用场景 三、常用的向量数据库解决方案 3.1 Milvus 3.1.1 Milvus是什么 3.1.2 Milvus主要特点 3.2 Faiss 3.2.1 Faiss是什么 3.2.2 Faiss主要特点 3.3 Pinecone 3.3.1 …

C/C++基础知识复习(30)

1) 什么是 C 中的 Lambda 表达式?它的作用是什么? Lambda 表达式: 在 C 中,Lambda 表达式是一种可以定义匿名函数的机制,可以在代码中快速创建一个内联的函数对象,而不需要显式地定义一个函数。Lambda 表…

通过抓包,使用frida定位加密位置

首先我们抓取一下我们要测试的app的某一个目标api,通过抓api的包,得到关键字。 例如:关键字:x-sap-ri 我们得到想要的关键字后,通过拦截 类,寻找我们的关键字,及找到发包收包的位置&#xff0c…

[网鼎杯 2020 朱雀组]phpweb 详细题解(反序列化绕过命令执行)

知识点: call_user_func() 函数 反序列化魔术方法 find命令查找flag 代码审计 打开题目,弹出上面的提示,是一个警告warning,而且页面每隔几秒就会刷新一次,根据warning中的信息以及信息中的时间一直在变,可以猜测是date()函数一直在被调用 查看源代码发现一些信息,但是作用…

UE5 和 UE4 中常用的控制台命令总结

调用控制台 按下键盘上的 ~ 键可以调用控制台命令。 技巧 使用键盘的 ↑ 键可以查看之前输入过的指令。控制台指令并不需要打全名,输入空格后跟随指令的部分字符可以进行模糊搜索。按下 Ctrl Shift , 打开 GPUProfile 面板。 命令如下: 调试类 s…