Выберите среднюю часть строки MSSQL - PullRequest
0 голосов
/ 16 мая 2018

Добрый день

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

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

x0gdfg992|x05gjy652|t0kk2:-

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

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

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

Ответы [ 5 ]

0 голосов
/ 16 мая 2018
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)
0 голосов
/ 16 мая 2018

Еще один вариант - через маленький XML

* ** 1003 тысяча два * * Пример 1004 * ** 1005
Select NewValue=cast('<x>' + replace(SomeCol,'|','</x><x>')+'</x>' as xml).value('/x[2]','varchar(max)')
 From YourTable

Returns

NewValue
x05gjy652
0 голосов
/ 16 мая 2018

Лично я бы использовал String Splitter, который дает Порядковый номер;например, DelimitedSplit8K .

Джеффа Модена. Это становится тривиальным:

SELECT DS.Item
FROM YourTable YT
     CROSS APPLY DelimitedSplit8K(YT.YourString, '|') DS
WHERE DS.ItemNumber = 2;
0 голосов
/ 16 мая 2018

Один вкладыш:

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 ... исключает последние |.

0 голосов
/ 16 мая 2018

Попробуйте это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...