第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用T-SQL,從字符串返回第n個分隔元素

使用T-SQL,從字符串返回第n個分隔元素

撒科打諢 2019-09-03 19:32:41
我需要創(chuàng)建一個函數(shù),它將返回分隔字符串的第n個元素。對于數(shù)據(jù)遷移項目,我使用SQL腳本將存儲在SQL Server數(shù)據(jù)庫中的JSON審核記錄轉(zhuǎn)換為結(jié)構(gòu)化報告。目標是提供腳本使用的sql腳本和sql函數(shù),而無需任何代碼。(這是一個短期修復(fù),將在ASP.NET / MVC應(yīng)用程序中添加新的審核功能時使用)可用的表格示例不缺少分隔字符串。我選擇了一個Common Table Expression示例http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings示例:我想從'1,222,2,67,888,1111'返回67
查看完整描述

3 回答

?
慕后森

TA貢獻1802條經(jīng)驗 獲得超5個贊

這是緩解67(類型安全!!)的最簡單的答案:


SELECT CAST('<x>' + REPLACE('1,222,2,67,888,1111',',','</x><x>') + '</x>' AS XML).value('/x[4]','int')

在下文中,您將找到如何將此變量用于字符串,分隔符和位置的變量的示例(即使對于具有XML禁止字符的邊案例)


這很簡單

這個問題不是關(guān)于字符串拆分方法,而是關(guān)于如何獲取第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:variable()或一起使用sql:column()

當然,您可以使用變量作為分隔符和位置(用于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)')

帶有XML禁止字符的Edge-Case

如果您的字符串可能包含禁用字符,您仍然可以這樣做。FOR XML PATH首先在字符串上使用,隱式替換所有禁用字符和擬合轉(zhuǎn)義序列。


如果 - 另外 - 你的分隔符是分號,這是一個非常特殊的情況。在這種情況下,我首先將分隔符替換為“#DLMT?!?,并最終將其替換為XML標記:


SET @input=N'Some <, > and &;Other ??ü@€;One more';

SET @dlmt=N';';

SELECT CAST(N'<x>' + REPLACE((SELECT REPLACE(@input,@dlmt,'#DLMT#') AS [*] FOR XML PATH('')),N'#DLMT#',N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)');

SQL-Server 2016+的更新

很遺憾,開發(fā)人員忘記返回部分索引STRING_SPLIT。但是,使用SQL-Server 2016+,有JSON_VALUE和OPENJSON。


與JSON_VALUE我們可以將該位置作為索引”數(shù)組傳遞。


對于OPENJSON該文件明確規(guī)定:


當OPENJSON解析JSON數(shù)組時,該函數(shù)將JSON文本中元素的索引作為鍵返回。


一個字符串只1,2,3需要括號:[1,2,3]。

也就是說像一個字符串this is an example需要是["this","is","an"," example"]。

這些是非常簡單的字符串操作。試試吧:


DECLARE @str VARCHAR(100)='Hello John Smith';

DECLARE @position INT = 2;


--We can build the json-path '$[1]' using CONCAT

SELECT JSON_VALUE('["' + REPLACE(@str,' ','","') + '"]',CONCAT('$[',@position-1,']'));

- 參見一個位置安全的字符串分割器(從零開始):


SELECT  JsonArray.[key] AS [Position]

       ,JsonArray.[value] AS [Part]

FROM OPENJSON('["' + REPLACE(@str,' ','","') + '"]') JsonArray

在這篇文章中,我測試了各種方法并發(fā)現(xiàn),這OPENJSON非常快。甚至比著名的“delimitedSplit8k()”方法快得多......


查看完整回答
反對 回復(fù) 2019-09-03
?
一只斗牛犬

TA貢獻1784條經(jīng)驗 獲得超2個贊

怎么樣:


CREATE FUNCTION dbo.NTH_ELEMENT (@Input NVARCHAR(MAX), @Delim CHAR = '-', @N INT = 0)

RETURNS NVARCHAR(MAX)

AS

BEGIN

RETURN (SELECT VALUE FROM STRING_SPLIT(@Input, @Delim) ORDER BY (SELECT NULL) OFFSET @N ROWS FETCH NEXT 1 ROW ONLY)

END


查看完整回答
反對 回復(fù) 2019-09-03
  • 3 回答
  • 0 關(guān)注
  • 683 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號