Как найти строку в столбце с определенным шаблоном

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть столбец, содержащий символьные данные, которые всегда имеют вид:

 String1/String2|String3|**String4**/String5|String6|String7/String8
  

Я хотел бы получить значение String4 для каждой записи, но не могу с этим справиться.

Я заметил, что длина String1/String2|String3| всегда равна 48, поэтому я попытался сделать что-то вроде

 substring (my_field, charindex('String1/String2|String3|',my_field) 48, 20) as **wanted_string**
  

Это работает не совсем так, как ожидалось, поскольку я изо всех сил пытаюсь сохранить только строку в String4 части, и я не хочу жестко кодировать в ней значение длины 48, поскольку оно может меняться со временем.

Я был бы признателен за любую помощь, чтобы заставить его работать.

Спасибо

Ответ №1:

Операции со строками в SQL Server относительно болезненны. Вы можете избавиться от первых 48 символов, используя stuff() , а затем использовать следующий разделитель:

 select left(v.my_field, charindex('|', v.my_field) - 1)
from t cross apply
     (values (stuff(t.my_field, 1, 48, ''))) v(my_field)
  

Ответ №2:

 declare @s varchar(100)='String1/String2|String3|**String4**/String5|String6|String7/String8';

select substring(@s,
--start@:pos 2nd |  1
charindex('|', @s, charindex('|',@s) 1) 1,
charindex('/', @s, charindex('|', @s, charindex('|',@s) 1)) --pos / after 2nd |
-
charindex('|', @s, charindex('|',@s) 1)-1 --subtract start@
);