Этот вопрос не о струнном разделенном подходе, но о как получить п-й элемента.
Все ответы здесь делают какие-то строки расщепления с помощью рекурсии, CTE
с, многократный CHARINDEX
, REVERSE
и PATINDEX
, изобретая функции, вызов методов CLR, количество таблиц, CROSS APPLY
ы ... Большинство ответов охватывают множество строк кода ,
Но - если вы действительно ничего не хочу больше, чем подход, чтобы получить п-й элемент - это может быть сделано, как реального однострочника, не 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
в своей строке, чтобы заменить все запрещенные символы неявно.
Это особый случай, если - дополнительно - Ваш разделитель - это точка с запятой. В этом случае я заменить разделитель первым на «# 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)');
См http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to -split-string-into-multiple-recor, а также – 2010-03-08 19:44:58