Порядок результата string_split? - PullRequest
0 голосов
/ 08 февраля 2020

Теперь я нашел эту замечательную функцию string_split(), а затем узнал, что выходные строки могут быть в любом порядке. Не гарантируется, что порядок соответствует порядку подстрок во входной строке. . Это делает функцию бесполезной для меня.

Возможно, есть обходной путь?

РЕДАКТИРОВАТЬ - Пример:

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

В этом случае я хочу этот результат в следующем порядке:

value
------
b
a
c

Однако, согласно Microsoft, этот заказ не гарантирован . Так как я могу получить именно этот результат?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вы можете попытаться использовать подход, основанный на JSON. Вам необходимо преобразовать входную строку в действительный массив JSON (b,a,c преобразуется в ["b","a","c"]), а затем проанализировать этот массив с OPENJSON() и схемой по умолчанию. В результате получается таблица со столбцами key, value и type, и на основе документации столбец 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
2 голосов
/ 08 февраля 2020

Если в строке, которую вы разбиваете, нет дубликатов, вы можете использовать ниже.

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

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