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()”方法快得多......

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
- 3 回答
- 0 關(guān)注
- 683 瀏覽
添加回答
舉報