powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Распарсить строку
13 сообщений из 13, страница 1 из 1
Распарсить строку
    #39902594
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день
Помогите пожалуйста распарсить строку такого типа:

Код: plaintext
{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}

И каждый элемент записать как отдельную запись. В строке разное количество элементов


Сейчас запрос возвращает
ID; PRODUCT_IDS
15; {i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}

Нужно получить

ID; PRODUCT_IDS
15; 3947
15; 4343
15; 4345
15; 4644
15; 4627
...
Рейтинг: 0 / 0
Распарсить строку
    #39902607
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрать обрамляющие скобки, финишную точку с запятой, 'i:', а остаток STRING_SPLIT-нуть... например.
...
Рейтинг: 0 / 0
Распарсить строку
    #39902610
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jango77,

версия сервера у вас какая?
Код: sql
1.
select @@VERSION
...
Рейтинг: 0 / 0
Распарсить строку
    #39902657
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jango77,

STRING_SPLIT
...
Рейтинг: 0 / 0
Распарсить строку
    #39902670
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если порядок не задается нечетными элементами то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare @v varchar(max) = '{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}'
set @v = replace(replace(@v, '{', ''), '}', '');
with x as (
    select row_number() over (order by 1/0) % 2 as [rn], * from string_split(@v, ';')
),
y as (
    select 
    row_number() over (order by 1/0) as [rn2],
    v.[value]
    from x 
          cross apply string_split(x.value, ':') v
    where rn = 0
)
select row_number() over (order by 1/0) as [rn],
       [value]
from y
where [rn2] % 2 = 0
...
Рейтинг: 0 / 0
Распарсить строку
    #39902677
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
jango77,

версия сервера у вас какая?
Код: sql
1.
select @@VERSION




Microsoft SQL Server 2017 (RTM-GDR) (KB4505224) - 14.0.2027.2 (X64) Jun 15 2019 00:26:19 Copyright (C) 2017 (64-bit)
...
Рейтинг: 0 / 0
Распарсить строку
    #39902715
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
если порядок не задается нечетными элементами то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare @v varchar(max) = '{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}'
set @v = replace(replace(@v, '{', ''), '}', '');
with x as (
    select row_number() over (order by 1/0) % 2 as [rn], * from string_split(@v, ';')
),
y as (
    select 
    row_number() over (order by 1/0) as [rn2],
    v.[value]
    from x 
          cross apply string_split(x.value, ':') v
    where rn = 0
)
select row_number() over (order by 1/0) as [rn],
       [value]
from y
where [rn2] % 2 = 0



Это сериализованный массив интов пехапешным сериализатором.

Нечетные элементы это индексы массива в виде тип:значение, четные -- значения вида тип:значение для интов, а в случае строк значение будет так s:3:"bfg"
ЗЫ: И вообще полная строка должна выглядеть вот так a:5:{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}
...
Рейтинг: 0 / 0
Распарсить строку
    #39902722
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Karbafos
felix_ff
если порядок не задается нечетными элементами то так


ЗЫ: И вообще полная строка должна выглядеть вот так a:5:{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}


так и есть. От a:5: удалось избавиться
...
Рейтинг: 0 / 0
Распарсить строку
    #39902757
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
если порядок не задается нечетными элементами то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare @v varchar(max) = '{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}'
set @v = replace(replace(@v, '{', ''), '}', '');
with x as (
    select row_number() over (order by 1/0) % 2 as [rn], * from string_split(@v, ';')
),
y as (
    select 
    row_number() over (order by 1/0) as [rn2],
    v.[value]
    from x 
          cross apply string_split(x.value, ':') v
    where rn = 0
)
select row_number() over (order by 1/0) as [rn],
       [value]
from y
where [rn2] % 2 = 0



Подскажите, пожалуйста, как этот синтаксис увязать с тем, что нужно распарсить со строки эти PRODUCT_IDS для каждого ID, чтобы селектом получить
ID; PRODUCT_IDS
15; 3947
15; 4343
15; 4345
15; 4644
15; 4627
...
Рейтинг: 0 / 0
Распарсить строку
    #39902796
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jango77,

парсеры хорошо пишутся на C# в виде табличных CLR функций. Поищите в инете.
...
Рейтинг: 0 / 0
Распарсить строку
    #39902803
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jango77,


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @t table(id int, product_ids nvarchar(100))

insert @t (id, product_ids) values
(15, '{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}'),
(16, '{i:0;i:232;i:1;i:5345;i:2;i:34534;i:3;i:1212;i:4;i:5555;}')

select 
	t.id, 
	product_ids = z.[value]
from @t as t
cross apply(values(replace(replace(replace(replace(t.product_ids, 'i:', ''), ';}', ']'), ';', ','), '{', '['))) as tt(jsn)
cross apply openjson(tt.jsn) as z
where z.[key] % 2 = 1
...
Рейтинг: 0 / 0
Распарсить строку
    #39902813
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
jango77,

парсеры хорошо пишутся на C# в виде табличных CLR функций. Поищите в инете.


Хотелось бы решить всю задачу через T-SQL (пишем импорт с базы битрикса)
чтобы вести разработку через одну точку администрирования импортов

Спасибо за предложенный вариант
...
Рейтинг: 0 / 0
Распарсить строку
    #39902818
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakill
jango77,


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @t table(id int, product_ids nvarchar(100))

insert @t (id, product_ids) values
(15, '{i:0;i:3947;i:1;i:4343;i:2;i:4345;i:3;i:4644;i:4;i:4627;}'),
(16, '{i:0;i:232;i:1;i:5345;i:2;i:34534;i:3;i:1212;i:4;i:5555;}')

select 
	t.id, 
	product_ids = z.[value]
from @t as t
cross apply(values(replace(replace(replace(replace(t.product_ids, 'i:', ''), ';}', ']'), ';', ','), '{', '['))) as tt(jsn)
cross apply openjson(tt.jsn) as z
where z.[key] % 2 = 1



Shakill , Спасибо Вам! Работает так как нужно по задаче
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Распарсить строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]