Выбор текста между 2-м и 3-м вхождением разделителя - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь выделить текст между вторым и третьим вхождением разделителя (-) в SQL-сервере.

Например, если у меня есть строка aaa-bbbb-cccc-dddd, я хотел бы вернуть cccc, но я не могу понять, как заставить работать подстроку, когда у меня более двух разделителей.

Спасибо за любую помощь

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Если у вас всегда одинаковое количество элементов, вы можете использовать PARSENAME следующим образом.

select parsename(replace('aaa-bbbb-cccc-dddd', '-', '.'), 2)

Но если ваши реальные данные не настолько согласованы, вам нужно использовать настоящий сплиттер.

1 голос
/ 04 ноября 2019

Если parsename() (+1) - недопустимая опция, возможно, немного XML.

Вот две иллюстрации, обе показывают одинаковые результаты

Пример

Declare @YourTable table (SomeCol varchar(500))
Insert Into @YourTable values
('aaa-bbbb-cccc-dddd')

Select SomeCol
      ,Pos2 = cast('<x>' + replace(A.SomeCol,'-','</x><x>')+'</x>' as xml).value('/x[2]','varchar(50)')
      ,Pos3 = cast('<x>' + replace(A.SomeCol,'-','</x><x>')+'</x>' as xml).value('/x[3]','varchar(50)')
 From  @YourTable A


Select SomeCol
      ,B.*
 From  @YourTable A
 Cross Apply (
                 Select Pos2 = XMLData.value('/x[2]','varchar(50)')
                       ,Pos3 = XMLData.value('/x[3]','varchar(50)')
                  From  (values (cast('<x>' + replace(A.SomeCol,'-','</x><x>')+'</x>' as xml))) B1(XMLData)
             ) B

Возвращает

SomeCol             Pos2    Pos3
aaa-bbbb-cccc-dddd  bbbb    cccc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...