SQL Server string_split的结果顺序?

kb5ga3dv  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(207)

现在我发现了这个很棒的string_split()函数,然后我了解到**输出行可能是任意顺序的,但不能保证顺序与输入字符串.**中子字符串的顺序相匹配,这使得这个函数对我来说毫无用处。
有没有变通的办法?

**编辑-**示例:

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

在这种情况下,我希望按以下顺序得到结果:

value
------
b
a
c

但是,根据微软的说法,这个订单是不保证的。那么我怎么才能准确地得到这个结果呢?

wdebmtf2

wdebmtf21#

    • 原答复:**

您可以尝试使用基于JSON的方法,需要将输入字符串转换为有效的JSON数组(b,a,c转换为["b","a","c"]),然后使用OPENJSON()和默认模式解析该数组。结果是一个包含keyvaluetype列的表,根据文档,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
    • 更新日期:**

从SQL Server 2022开始,STRING_SPLIT()函数支持第三个可选参数(enable_ordinal)。该参数是intbit表达式,用作启用或禁用ordinal输出列的标志。值1启用ordinal列。如果省略enable_ordinalNULL,或具有0的值,则禁用ordinal列。

SELECT [value]
FROM STRING_SPLIT(@StringToSplit, ',', 1)
ORDER BY [ordinal]
2guxujil

2guxujil2#

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

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

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

093gszye3#

<!-- 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

相关问题