sql-server – 使用T-SQL,从字符串返回第n个分隔元素

前端之家收集整理的这篇文章主要介绍了sql-server – 使用T-SQL,从字符串返回第n个分隔元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要创建一个函数,它将返回分隔字符串的第n个元素.

对于数据迁移项目,我使用sql脚本将存储在sql Server数据库中的JSON审核记录转换为结构化报告.目标是在没有任何代码的情况下提供脚本使用的sql脚本和sql函数.

(这是一个短期修复,将在ASP.NET / MVC应用程序中添加新的审计功能时使用)

可用的表格示例不缺少分隔的字符串.
我选择了Common Table Expression示例http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings

示例:我想从’1,222,2,67,888,1111’返回67

解决方法

这是缓解67(类型安全!!)的最简单答案:
SELECT CAST('<x>' + REPLACE('1,1111',','</x><x>') + '</x>' AS XML).value('/x[4]','int')

这个问题不是关于字符串拆分方法,而是关于如何获取第n个元素.这个IMO是最简单,完全可以内联的方式:

这是一个真正的单行程序,可以通过空格分隔第2部分:

DECLARE @input NVARCHAR(100)=N'part1 part2 part3';
SELECT CAST(N'<x>' + REPLACE(@input,N' ',N'</x><x>') + N'</x>' AS XML).value('/x[2]','nvarchar(max)')

当然,您可以使用变量进行分隔符和位置(使用sql:column直接从查询的值中检索位置):

DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(@input,@dlmt,N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)')

如果您的字符串可能包含禁用字符,您仍然可以这样做.首先在字符串上使用FOR XML PATH,以隐式替换所有禁用字符和拟合转义序列.

如果 – 另外 – 你的分隔符是分号,这是一个非常特殊的情况.在这种情况下,我首先将分隔符替换为’#DLMT#’,并最终将其替换为XML标记

SET @input=N'Some <,> and &;Other äöü@€;One more';
SET @dlmt=N';';
SELECT CAST(N'<x>' + REPLACE((SELECT REPLACE(@input,'#DLMT#') AS [*] FOR XML PATH('')),N'#DLMT#','nvarchar(max)');

猜你在找的MsSQL相关文章