string_split的结果顺序?

Result order of string_split?

现在我发现了这个很棒的 string_split() 函数,然后我了解到 输出行可以按任何顺序排列。不能保证顺序与输入字符串中子字符串的顺序匹配。。这使该功能对我无用。

是否有解决方法?

编辑 - 示例:

SELECT value FROM String_Split('b,a,c', ',')

在这种情况下,我想要这个顺序的结果:

value
------
b
a
c

但是,根据 Microsoft 的说法,此顺序无法保证。那么我怎样才能得到这个结果呢?

如果您要拆分的字符串中没有重复项,您可以使用下面的方法。

DECLARE @StringToSplit VARCHAR(100) = 'b,a,c';

SELECT  
    value 
FROM String_Split(@StringToSplit, ',') d
ORDER BY CHARINDEX(','+  value+ ',',  ',' + @StringToSplit + ',' )

您可以尝试使用基于 JSON 的方法。您需要将输入字符串转换为有效的 JSON 数组(b,a,c 转换为 ["b","a","c"]),然后使用 OPENJSON() 和默认架构解析此数组。结果是包含 keyvaluetype 列的 table,根据文档,key 列是 一个 nvarchar (4000) 包含指定 属性 名称或指定数组中元素索引的值 .

声明:

DECLARE @StringToSplit VARCHAR(100) = 'b,a,c';

SELECT [value]
FROM OPENJSON(CONCAT('["', REPLACE(@StringToSplit, ',', '","'), '"]'))
ORDER BY CONVERT(int, [key])

结果:

value
b
a
c

如果输入字符串中有引号,请尝试使用以下语句,使用 STRING_ESCAPE():

DECLARE @StringToSplit VARCHAR(100) = '"b",''a'',c';

SELECT [value]
FROM OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(@StringToSplit, 'json'), ',', '","'), '"]'))
ORDER BY CONVERT(int, [key])

结果:

value
"b"
'a'
c
 <!-- language: lang-sql --> 
SELECT p.[Id], [p].[Body], [x].[value], x.[RN]
FROM [dbo].[Posts] AS [p]
CROSS APPLY (
SELECT ss.[value], 
     ROW_NUMBER() OVER (PARTITION BY [p].[Id] ORDER BY [p].[Id]) AS RN <--------- (SORT)
FROM STRING_SPLIT([p].[Body], ' ') AS [ss]
      ) AS x