Этот вопрос не о подходе разделения строк , а о как получить n-й элемент .
Все ответы здесь делают какое-то разбиение строк с использованием рекурсии, CTE
s, кратные CHARINDEX
, REVERSE
и PATINDEX
, изобретения функций, вызов методов CLR, таблиц чисел, CROSS APPLY
s. .. Большинство ответов охватывают много строк кода.
Но - если вы действительно не хотите ничего, кроме подхода к получению n-го элемента - это можно сделать как настоящий однострочный , без UDF, даже без вложенного выберите ... И в качестве дополнительного преимущества: тип сейфа
Получить часть 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: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)')
Если ваша строка может содержать запрещенных символов (особенно один из &><
), вы все равно можете сделать это следующим образом. Просто используйте FOR XML PATH
в вашей строке, чтобы неявно заменить все запрещенные символы подходящей escape-последовательностью.
Это особый случай, если - дополнительно - ваш разделитель - точка с запятой . В этом случае сначала я заменяю разделитель на «# 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 +
К сожалению, разработчики забыли вернуть индекс детали с STRING_SPLIT
. Но, используя SQL-Server 2016+, есть OPENJSON
.
Документация четко гласит:
Когда OPENJSON анализирует массив JSON, функция возвращает индексы элементов в тексте JSON в качестве ключей.
Строка типа 1,2,3
не требует ничего, кроме скобок: [1,2,3]
.
Строка слов вроде this is an example
должна быть ["this","is","an"," example"]
.
Это очень простые строковые операции. Просто попробуйте:
DECLARE @str VARCHAR(100)='Hello John Smith';
SELECT [value]
FROM OPENJSON('["' + REPLACE(@str,' ','","') + '"]')
WHERE [key]=1 --zero-based!