#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@
);