Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Парсинг utm-меток  [new]
hulk77
Member

Откуда:
Сообщений: 123
Подскажите пожалуйста, как наиболее предусмотрительно разнести на три поля значения ссылок типа:

?utm_source=facebook.com&utm_campaign=K&utm_medium=cpa&utm_content=info2
?utm_source=facebook
?utm_source=vk&utm_campaign=vkalex&utm_medium=smm

набор utm разный
делаю через SUBSTRING и PATHINDEX, но с проверками выходит монструозная конструкция
Может есть более простой способ
6 апр 17, 21:57    [20375370]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг utm-меток  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
declare @t table (s varchar(1000));

insert into @t
values
 ('?utm_source=facebook.com&utm_campaign=K&utm_medium=cpa&utm_content=info2'),
 ('?utm_source=facebook'),
 ('?utm_source=vk&utm_campaign=vkalex&utm_medium=smm');

select
 t.s,
 b.n.value('@utm_source', 'varchar(100)') as utm_source,
 b.n.value('@utm_campaign', 'varchar(100)') as utm_campaign,
 b.n.value('@utm_medium', 'varchar(100)') as utm_medium,
 b.n.value('@utm_content', 'varchar(100)') as utm_content
from
 @t t cross apply
 (select cast(replace(replace(replace(t.s, '?', '<a '), '=', '="'), '&', '" ') + '" />' as xml)) a(x) cross apply
 a.x.nodes('a') b(n);
6 апр 17, 22:16    [20375420]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг utm-меток  [new]
hulk77
Member

Откуда:
Сообщений: 123
invm,
Спасибо Вам огромное!
6 апр 17, 22:19    [20375424]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг utm-меток  [new]
hulk77
Member

Откуда:
Сообщений: 123
Сегодня словил не верно составленную ссылку с utm такого типа
?utm_source=kadam&utm_campaign=259067&utm_content=2361637&utm_term=IAB24&utm_content=2001636'

на которую SQL Server ругнулся
Синтаксический анализ XML: строка 1, символ 144, дублированный атрибут

Можно как-то брать в расчет только первое вхождение атрибута и игнорировать последующие?
Если это нельзя сделать как с xml-строкой, может возможно манипуляциями как с обычной строкой?
11 апр 17, 21:03    [20391386]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг utm-меток  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
hulk77
Можно как-то брать в расчет только первое вхождение атрибута и игнорировать последующие?
Как-то так:
declare @t table (s varchar(1000));

insert into @t
values
 ('?utm_source=kadam&utm_campaign=259067&utm_content=2361637&utm_term=IAB24&utm_content=2001636'),
 ('?utm_source=facebook.com&utm_campaign=K&utm_medium=cpa&utm_content=info2'),
 ('?utm_source=facebook'),
 ('?utm_source=vk&utm_campaign=vkalex&utm_medium=smm');

select
 b.n.value('a[not(empty(@utm_source))][1]/@utm_source', 'varchar(100)') as utm_source,
 b.n.value('a[not(empty(@utm_campaign))][1]/@utm_campaign', 'varchar(100)') as utm_campaign,
 b.n.value('a[not(empty(@utm_medium))][1]/@utm_medium', 'varchar(100)') as utm_medium,
 b.n.value('a[not(empty(@utm_content))][1]/@utm_content', 'varchar(100)') as utm_content,
 b.n.value('a[not(empty(@utm_term))][1]/@utm_term', 'varchar(100)') as utm_term
from
 @t t cross apply
 (select cast(replace(replace(replace(t.s, '?', '<item><a '), '=', '="'), '&', '"/><a ') + '"/></item>' as xml)) a(x) cross apply
 a.x.nodes('item') b(n);
11 апр 17, 22:10    [20391687]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг utm-меток  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Что-то торможу...
Вот так правильно:
select
 b.n.value('a[@utm_source][1]/@utm_source', 'varchar(100)') as utm_source,
 b.n.value('a[@utm_campaign][1]/@utm_campaign', 'varchar(100)') as utm_campaign,
 b.n.value('a[@utm_medium][1]/@utm_medium', 'varchar(100)') as utm_medium,
 b.n.value('a[@utm_content][1]/@utm_content', 'varchar(100)') as utm_content,
 b.n.value('a[@utm_term][1]/@utm_term', 'varchar(100)') as utm_term
from
 @t t cross apply
 (select cast(replace(replace(replace(t.s, '?', '<item><a '), '=', '="'), '&', '"/><a ') + '"/></item>' as xml)) a(x) cross apply
 a.x.nodes('item') b(n);
11 апр 17, 22:39    [20391830]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг utm-меток  [new]
hulk77
Member

Откуда:
Сообщений: 123
invm, Спасибо в очередной раз!
12 апр 17, 10:23    [20392733]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить