Выберите среднюю часть строки MSSQL

Добрый день

У меня проблема, я не могу исправить запрос, чтобы выбрать средний фрагмент строки.

У меня есть таблица с более чем 1000 строками и строками, например:

x0gdfg992|x05gjy652|t0kk2:-

Мне нужно выбрать деталь: x05gjy652

Спасибо за мнения

Не могу изменить входные данные.

Фиксированные позиции или переменные?

jarlh 16.05.2018 11:23

Проверьте эту ссылку - sqlservercentral.com/Forums/969662/…

Abhishek 16.05.2018 11:27
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
231
5

Ответы 5

Попробуй это

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 )
  1. CHARINDEX('|',@s)+1 ... находит позицию первого |
  2. (CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))-CHARINDEX('|',@s) -1 ... Вычисляет необходимую длину строки для строки между первым | и вторым |.

Подробно второй пункт, который может сбить с толку:

  1. (CHARINDEX('|',@s,(CHARINDEX('|',@s)+1))) ... поиск | после первого | (отправная точка - (CHARINDEX('|',@s)+1))

  2. CHARINDEX('|',@s) ... позиция первого |

  3. -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)

Другие вопросы по теме