Добрый день
У меня проблема, я не могу исправить запрос, чтобы выбрать средний фрагмент строки.
У меня есть таблица с более чем 1000 строками и строками, например:
x0gdfg992|x05gjy652|t0kk2:-
Мне нужно выбрать деталь: x05gjy652
Спасибо за мнения
Не могу изменить входные данные.
Проверьте эту ссылку - sqlservercentral.com/Forums/969662/…


Попробуй это
DECLARE @String nvarchar(100)
SET @String='x0gdfg992|x05gjy652|t0kk2'
SELECT SUBSTRING(String,0,CHARINDEX('|',String)) AS RequiredPart
FROM
(
SELECT SUBSTRING(@String,CHARINDEX('|',@String)+1,LEN(@String)) AS String
)dt
Результат, Демо: http://rextester.com/OSSUS74768
RequiredPart
--------------
x05gjy652
Лично я бы использовал String Splitter, который дает Ordinal Position; например DelimitedSplit8K Джеффа Модена.
Тогда это становится тривиальным:
SELECT DS.Item
FROM YourTable YT
CROSS APPLY DelimitedSplit8K(YT.YourString, '|') DS
WHERE DS.ItemNumber = 2;
Один лайнер:
declare @s nvarchar(100)
SET @s = N'x0gdfg992|x05gjy652|t0kk2:-'
SELECT SUBSTRING(@s, CHARINDEX('|',@s)+1, (CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))-CHARINDEX('|',@s) -1 )
CHARINDEX('|',@s)+1 ... находит позицию первого |(CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))-CHARINDEX('|',@s) -1 ... Вычисляет необходимую длину строки для строки между первым | и вторым |.Подробно второй пункт, который может сбить с толку:
(CHARINDEX('|',@s,(CHARINDEX('|',@s)+1))) ... поиск | после первого | (отправная точка - (CHARINDEX('|',@s)+1))
CHARINDEX('|',@s) ... позиция первого |
-1 ... - исключить последний |.
Еще один вариант - через небольшой XML
Пример
Select NewValue=cast('<x>' + replace(SomeCol,'|','</x><x>')+'</x>' as xml).value('/x[2]','varchar(max)')
From YourTable
Возврат
NewValue
x05gjy652
DECLARE @A VARCHAR(200)='x0gdfg992|x05gjy652|t0kk2',
@B VARCHAR(500)
SELECT @B=SUBSTRING(@A,CHARINDEX('|',@A,1)+1,LEN(@A))
SELECT
SUBSTRING((SUBSTRING(@A,CHARINDEX('|',@A,1)+1,LEN(@A))),1,CHARINDEX('|',
(SUBSTRING(@A,CHARINDEX('|',@A,1)+1,LEN(@A))),1)-1)
Фиксированные позиции или переменные?