SQL Server 2022 STRING_SPLIT表值函数特性增强

SQL Server 2022 STRING_SPLIT表值函数特性增强

1、本文内容

  • List item
  • 语法
  • 参数
  • 返回类型
  • 注解

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

STRING_SPLIT 是一个表值函数,它根据指定的分隔符将字符串拆分为子字符串行。

兼容性级别为 130
STRING_SPLIT 要求兼容性级别至少为 130。 该级别低于 130 时,数据库引擎将找不到 STRING_SPLIT 函数。

若要更改数据库的兼容性级别,请参阅查看或更改数据库的兼容性级别。

备注:在 Azure Synapse Analytics 中,无需对 STRING_SPLIT 进行兼容性配置。

参考官方文档地址
https://learn.microsoft.com/zh-cn/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver16

2、语法

STRING_SPLIT ( string , separator [ , enable_ordinal ] )

3、参数

string
任何字符类型(例如 nvarchar、varchar、nchar 或 char)的表达式。

separator
任何字符类型(例如nvarchar(1)、varchar(1)、nchar(1) 或 char(1))的单字符表达式,用作串联子字符串的分隔符。

enable_ordinal
适用于:Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics(仅限无服务器 SQL 池)、SQL Server 2022 (16.x) 及更高版本,也是该版本新加特性。

一个 int 或 bit 表达式,用作启用或禁用 ordinal 输出列的标志。 如果值为 1,则启用 ordinal 列。 如果省略 enable_ordinal 、为 NULL 或值为 0,则禁用 ordinal 列。

4、返回类型

如果未启用 ordinal 输出列,STRING_SPLIT 将返回一个单列表,其中的行为子字符串。 列的名称为 value。 如果任何输入参数为 nvarchar 或 nchar,则它返回 nvarchar 。 否则,将返回 varchar。 返回类型的长度与字符串参数的长度相同。
如果 enable_ordinal 参数传递的值为 1,则返回第二个名为 ordinal 的列,其中包含每个子字符串在输入字符串中的位置(从 1 开始的索引值)。 返回类型为 bigint

5、注解

STRING_SPLIT 输入一个包含分隔子字符串的字符串,并输入一个字符用作分隔符。 根据需要,函数还支持值为 0 或 1 的第三个参数,该参数分别禁用或启用了 ordinal 输出列。

STRING_SPLIT 输出一个单列表或双列表,具体取决于 enable_ordinal 参数。

如果 enable_ordinal 为 NULL、被省略或值为 0,STRING_SPLIT 将返回一个单列表,其中的行包含子字符串。 输出列的名称为 value。

如果 enable_ordinal 的值为 1,该函数将返回一个包含两列的表,其中 ordinal 列由原始输入字符串中从 1 开始的子字符串的索引值组成。

请注意,enable_ordinal 参数必须是常数值,而不能是列或变量。 它还必须是值为 0 或 1 的 bit 或 int 数据类型。 否则,此函数将引发错误。

输出行可以按任意顺序排列。 顺序不保证与输入字符串中的子字符串顺序匹配。 可以通过使用 ORDER BY 子句(在 SELECT 语句中)覆盖最终排序顺序,例如 ORDER BY value 或 ORDER BY ordinal。

0x0000 (char(0)) 是 Windows 排序规则中未定义的字符,无法包括在 STRING_SPLIT 中。

当输入字符串包含两个或多个连续出现的分隔符字符时,将出现长度为零的空子字符串。 空子字符串的处理方式与普通子字符串相同。 可以通过使用 WHERE 子句筛选出包含空的子字符串的任何行,例如 WHERE value <> ‘’。 如果输入字符串为 NULL,则 STRING_SPLIT 表值函数返回一个空表。

5.1、在SQLServer2016/2019版本,执行语句

SELECT * FROM STRING_SPLIT('hello sqlserver2022 SQLServer Management Studio',' ')value                                           ordinal
----------------------------------------------- --------------------
hello                                           1
sqlserver2022                                   2
SQLServer                                       3
Management                                      4
Studio                                          5
-- 如果多指定一个参数,表示启用enable_ordinal ,SQLServer2016/2019版本就不支持
SELECT * FROM STRING_SPLIT('hello sqlserver2022 SQLServer Management Studio',' ',1)
/*消息 8144,级别 16,状态 3,第 100 行
为过程或函数 STRING_SPLIT 指定了过多的参数*/

5.2、在SQLServer2022

SELECT * FROM STRING_SPLIT('hello sqlserver2022 SQLServer Management Studio', ' ',1);value                                           ordinal
----------------------------------------------- --------------------
hello                                           1
sqlserver2022                                   2
SQLServer                                       3
Management                                      4
Studio                                          5

6、示例

6.1、拆分逗号分隔值字符串

分析逗号分隔值列表,并返回所有非空标记:

SELECT * FROM STRING_SPLIT('hello,sqlserver2022,SQLServer,,Management Studio', ',',1);value                                            ordinal
------------------------------------------------ --------------------
hello                                            1
sqlserver2022                                    2
SQLServer                                        34
Management Studio                                5-- RTRIM(value) 过滤空值
SELECT * FROM STRING_SPLIT('hello,sqlserver2022,SQLServer,,Management Studio', ',',1) WHERE RTRIM(value) <> '';value                                            ordinal
------------------------------------------------ --------------------
hello                                            1
sqlserver2022                                    2
SQLServer                                        3
Management Studio                                5
-- 如果分隔符之间没有任何内容,STRING_SPLIT将返回空字符串。RTRIM(value) <> '' 条件将过滤空值value。

6.2、 拆分一列中的逗号分隔值字符串

生产表中的某一列为逗号分隔的标记列表,如以下示例所示:

WITH Product(ProductId,NameInfo,tags) AS (
SELECT 1,'mssql','sqlserver2016,sqlserver2019,sqlserver2022'
UNION ALL
SELECT 2,'oracle','oracle11g,oracle12c,mysql8.4'
)
SELECT ProductId, NameInfo, value
FROM ProductCROSS APPLY STRING_SPLIT(Tags, ',');ProductId   NameInfo value
----------- -------- -----------------------------------------
1           mssql    sqlserver2016
1           mssql    sqlserver2019
1           mssql    sqlserver2022
2           oracle   oracle11g
2           oracle   oracle12c
2           oracle   mysql8.4

6.3、按序号值为行排序

下面的语句返回输入字符串的拆分子字符串值及其序号值,按 ordinal 列排序

-- 倒序排序
SELECT * FROM STRING_SPLIT(N'深圳-广州-中山-东莞-珠海', '-', 1) ORDER BY ordinal DESC;value          ordinal
-------------- --------------------
珠海             5
东莞             4
中山             3
广州             2
深圳             1
-- 升序排序
SELECT * FROM STRING_SPLIT(N'深圳-广州-中山-东莞-珠海', '-', 1) ORDER BY ordinal;value          ordinal
-------------- --------------------
深圳             1
广州             2
中山             3
东莞             4
珠海             5

6.4、按序号值查找行

以下语句将查找具有偶数索引值的所有行

SELECT value AS v_split, ordinal FROM STRING_SPLIT(N'深圳-广州-中山-东莞-珠海', '-', 1) WHERE ordinal % 2 = 0;v_split        ordinal
-------------- --------------------
广州             2
东莞             4

6.5、按标记值搜索

6.5.1、查找具有单个标记 (sqlserver2022) 的数据行

WITH Product(ProductId,NameInfo,tags) AS (
SELECT 1,'mssql','sqlserver2016,sqlserver2019,sqlserver2022'
UNION ALL
SELECT 2,'oracle','oracle11g,oracle12c,mysql8.4'
)
SELECT ProductId, NameInfo, Tags
FROM Product
WHERE 'sqlserver2022' IN (SELECT value FROM STRING_SPLIT(Tags, ','));
ProductId   NameInfo Tags
----------- -------- -----------------------------------------
1           mssql    sqlserver2016,sqlserver2019,sqlserver2022

6.5.2、查找具有两个指定标记(sqlserver2022和 mysql8.4)的数据行

WITH Product(ProductId,NameInfo,tags) AS (
SELECT 1,'mssql','sqlserver2016,sqlserver2019,sqlserver2022'
UNION ALL
SELECT 2,'oracle','oracle11g,oracle12c,mysql8.4'
UNION ALL
SELECT 3,'postgresql','postgresql16,postgresql15'
)
SELECT ProductId, NameInfo, Tags
FROM Product
WHERE EXISTS (SELECT *FROM STRING_SPLIT(Tags, ',')WHERE value IN ('sqlserver2022', 'mysql8.4'));ProductId   NameInfo   Tags
----------- ---------- -----------------------------------------
1           mssql      sqlserver2016,sqlserver2019,sqlserver2022
2           oracle     oracle11g,oracle12c,mysql8.4

6.6、按一系列值查找行

WITH Product(ProductId,NameInfo,tags) AS (
SELECT 1,'mssql','sqlserver2016,sqlserver2019,sqlserver2022'
UNION ALL
SELECT 2,'oracle','oracle11g,oracle12c,mysql8.4'
UNION ALL
SELECT 3,'postgresql','postgresql16,postgresql15'
)
SELECT ProductId, NameInfo, Tags
FROM Product
JOIN STRING_SPLIT('1,3',',')ON value = ProductId;ProductId   NameInfo   Tags
----------- ---------- -----------------------------------------
1           mssql      sqlserver2016,sqlserver2019,sqlserver2022
3           postgresql postgresql16,postgresql15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang内置包strings和bytes中的Map函数的理解和使用示例

在go的标志内置包strings和bytes中都有一个函数Map, 这个函数的作用是&#xff1a; 将输入字符串/字节切片中的每个字符使用函数处理后映射后返回一份字符串/字节切片的副本&#xff0c;如果函数中的某个字符返回负数则删除对应的字符。 作用很简单&#xff0c;当时对于新手来…

Qt_tftp(未总结)

记录一下tftp传输,日后总结 #ifndef CLIENTWORK_H #define CLIENTWORK_H#include <QObject> #include <QThread>#include <QHostAddress>

关于C的\r回车在不同平台的问题

首先我们需要搞明白\r和\n是两回事 \r是回车&#xff0c;前者使光标到行首&#xff0c;&#xff08;carriage return&#xff09; \n是换行&#xff0c;后者使光标下移一格&#xff0c;&#xff08;line feed&#xff09; Linux平台下 #include <stdio.h> int main()…

Unidac连接Excel文件

终于找到一个连接字符串&#xff0c;记录一下 UniConnection1.ConnectString : Format(Provider NameODBC;Server"DRIVERMicrosoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb); DBQ%s", [FileName]); UniConnection1.connected:true; UniConnection1.gettable…

神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks

相关链接&#xff1a; 神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks-CSDN博客 神经网络不确定性综述(Part II)——Uncertainty estimation_Single deterministic methods-CSDN博客 神经网络不确定性综述(Part III)——Uncertainty est…

Python实现xml解析并输出到Excel上

1.编写xml文件 2.使用Python的ElementTree模块来解析XML import xml.etree.ElementTree as ET from openpyxl import Workbook # 解析XML函数 def parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot() --打开根节点data []for user in root.findall(Users/Us…

1.手动LogisticRegression模型的训练和预测

通过这个示例&#xff0c;可以了解逻辑回归模型的基本原理和训练过程&#xff0c;同时可以通过修改和优化代码来进一步探索机器学习模型的训练和调优方法。 过程: 生成了一个模拟的二分类数据集&#xff1a;通过随机生成包含两个特征的数据data_x&#xff0c;并基于一定规则生…

秋招突击——算法打卡——5/25、5/26——寻找两个正序数组的中位数

题目描述 自我尝试 首先&#xff0c;就是两个有序的数组进行遍历&#xff0c;遍历到一半即可。然后求出均值&#xff0c;下述是我的代码。但这明显是有问题的&#xff0c;具体错误的代码如下。计算复杂度太高了&#xff0c;O&#xff08;n&#xff09;&#xff0c;所以会超时&…

数据结构--《二叉树》

二叉树 1、什么是二叉树 二叉树(Binar Tree)是n(n>0)个结点的优先集合&#xff0c;该集合或者为空集(称为空二叉树)&#xff0c;或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树构成。 这里给张图&#xff0c;能更直观的感受二叉树&#xff1…

GDPU JavaWeb mvc模式

搭建一个mvc框架的小实例。 简易计算器 有一个名为inputNumber.jsp的页面提供一个表单&#xff0c;用户可以通过表单输入两个数和运算符号提交给Servlet控制器&#xff1b;由名为ComputerBean.java生成的JavaBean负责存储运算数、运算符号和运算结果&#xff0c;由名为handleCo…

C#中获取FTP服务器文件

1、从ftp下载pdf的方法 public static void DownloadPdfFileFromFtp(string ftpUrl,string user,string password string localPath) { // 创建FtpWebRequest对象 FtpWebRequest request (FtpWebRequest)WebRequest.Create(ftpUrl); request.Method WebRequestMethods.Ftp…

简单好用的文本识别方法--付费的好用,免费的更有性价比-记笔记

文章目录 先说付费的进入真题&#xff0c;免费的来喏&#xff01;PixPin微信 先说付费的 直达网址!!! 进入真题&#xff0c;免费的来喏&#xff01; PixPin 商店里就有 使用示例&#xff1a; 可以看到&#xff1a;贴在桌面上的图片可以复制图片中的文字&#xff0c;真的很…

深入了解ASPICE标准:提升汽车软件开发与质量管理的利器

随着汽车行业的快速发展和技术创新&#xff0c;汽车软件的开发和质量管理的重视程度不断提升。ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;标准作为一种专门针对汽车软件开发过程的改进和能力评定的框架&#xff0c;…

Springboot+Vue+ElementUI开发前后端分离的员工管理系统01--系统介绍

项目介绍 springboot_vue_emp是一个基于SpringbootVueElementUI实现的前后端分离的员工管理系统 功能涵盖&#xff1a; 系统管理&#xff1a;用户管理、角色管理、菜单管理、字典管理、部门管理出勤管理&#xff1a;请假管理、考勤统计、工资发放、工资统计、离职申请、个人资…

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…

最重要的时间表示,柯桥外贸俄语小班课

в第四格 1、与表示“钟点”的数词词组连用 例&#xff1a; в шесть часов утра 在早上六点 в пять тридцать 在五点半 2、与表示“星期”的名词连用 例&#xff1a; в пятницу 在周五 в следующий понедельник …

包和依赖管理:Python的pip和conda使用指南

包和依赖管理&#xff1a;Python的pip和conda使用指南 对于Python新手来说&#xff0c;包和依赖管理可能是一个令人困惑的概念。但不用担心&#xff0c;本文将用浅显易懂的语言&#xff0c;详细介绍如何使用Python的两个主要包管理工具&#xff1a;pip和conda。我们还会探讨在安…

为 AWS 子账户添加安全组修改权限

文章目录 步骤 1&#xff1a;创建 IAM 策略步骤 2&#xff1a;附加策略到子账户步骤 3&#xff1a;验证权限 本文档将操作如何为 AWS 子账户&#xff08;IAM 用户或角色&#xff09;添加修改安全组的权限&#xff0c;包括 AuthorizeSecurityGroupIngress 和 RevokeSecurityGr…

解决uniApp 中不能直接使用 Axios 的问题

最近在使用 uniapp 进行小程序开发的时候&#xff0c;发现 uniapp 不能直接使用 axios&#xff0c;需要自己进行封装一个 http 库使用&#xff0c;于是有了这个项目。 项目地址&#xff1a;https://www.npmjs.com/package/uni-app-wxnetwork-tool 该包的功能介绍&#xff1a; u…

String类为什么设计成不可变的?

目录 缓存 安全性 线程安全 hashCode缓存 性能 其实这个问题我们可以通过缓存、安全性、线程安全和性能几个维度去解析。 缓存 字符串是Java最常用的数据结构&#xff0c;我们都知道字符串大量创建是非常耗费资源的&#xff0c;所以Java中就将String设计为带有缓存的功能…