У меня есть требование разделить строку на основе разделителя и извлечь значения на основе их порядковых номеров. Поскольку я использую SQL Server 2019, я не могу использовать String_Split с включенным порядковым номером . Попытка воспроизвести ту же функциональность, используя запросы STRING_SPLIT и Row_Number() ниже.
select *, row_number() over(order by (select null)) as seq
from (
SELECT *
FROM STRING_SPLIT(CurrentPath, '/') where value <> ''
) t
Мой вопрос: при использовании select null вместе с предложением order by и string_split будет ли порядок значений детерминированным? Мне нужно сохранить порядок, в котором значения возвращаются функцией string_split. Есть какие-нибудь указатели?
@YitzhakKhabinsky ОП сделал все вышеперечисленное. Это известная проблема SQL Server 2019, и ответ, к сожалению, You're out of luck
Единственный способ обеспечить порядок — использовать предложение order by. Скорее всего, большую часть времени он будет последовательным, но это не гарантировано. Это было самое большое колебание и промах команды sql-сервера за долгое время. К счастью, они исправили это в 2022 году, но сейчас это вам не поможет.
Это распространенный вопрос, но все ответы показывают приемы, которые работают в очень конкретных случаях. Если данные можно преобразовать в JSON, можно использовать OPENJSON. Если данные можно проанализировать как иерархиюID, вы можете получить значения по уровням, но не все сразу.
Мое самое большое разочарование в связи с этим промахом, @SeanLange, заключается в том, что им потребовалось 6 лет, чтобы решить эту проблему, несмотря на то, как быстро сообщество сказало им: «Нам это нужно!» после объявления функции в 2015/2016 году.
У кого-нибудь сложилось впечатление, что MS в наши дни больше интересуется PostgreSQL? Они только что анонсировали REGEXP_SUB
для Azure SQL. Наряду со всеми этими сверхважными функциями SQL Server 2022, такими как ..... заказал STRING_SPLIT ?
Поскольку вы из 2019 года, вы можете использовать немного JSON.
Здесь [ключ] — ваша последовательность
Пример
Declare @YourTable Table ([ID] varchar(50),[CurrentPath] varchar(50)) Insert Into @YourTable Values
(1,'aa\bb\cc')
,(2,'aa\bb\cc\dd')
Select A.ID
,B.[key]
,B.[value]
from @YourTable A
Cross Apply OpenJSON( '["'+replace([CurrentPath],'\','","')+'"]' ) B
Полученные результаты
ID key value
1 0 aa
1 1 bb
1 2 cc
2 0 aa
2 1 bb
2 2 cc
2 3 dd
will the order of values be deterministic?
- нет.