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

Откуда:
Сообщений: 119
Как для каждого ID выбрать только те P2, где P1=1 ?
Структура данных такая
declare @xml xml='
  <tag1 id="1">
    <tag2 p1="1" p2="11"/>
    <tag2 p1="2" p2="22"/>
  </tag1>
  <tag1 id="2">
    <tag2 p1="3" p2="33"/>
    <tag2 p1="1" p2="12"/>
  </tag1>'

SELECT
  id=c.value('@id[1]','VARCHAR(2)'),  
  p2=c.value('./tag2[1]/@p2','VARCHAR(2)')
  -- так не работает 
  -- p2=c.value('./tag2[@p1="1"]/@p2','VARCHAR(2)')
FROM @xml.nodes('/tag1') t(c)
10 сен 19, 21:07    [21968127]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения из XML по xpath  [new]
invm
Member

Откуда: Москва
Сообщений: 8750
select
 a.n.value('@id', 'int'),
 b.n.value('@p2', 'int')
from
 @xml.nodes('/tag1') a(n) cross apply
 a.n.nodes('tag2[@p1 = "1"]') b(n);
10 сен 19, 21:47    [21968152]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения из XML по xpath  [new]
unno
Member

Откуда:
Сообщений: 119
Спасибо, работает!
Т.е. фильтр для уникальности value надо накладывать на уровне nodes и без cross apply никак не обойтись?
10 сен 19, 22:01    [21968155]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения из XML по xpath  [new]
invm
Member

Откуда: Москва
Сообщений: 8750
unno
без cross apply никак не обойтись?
Можно и без
select
 a.n.value('../@id', 'int'),
 a.n.value('@p2', 'int')
from
 @xml.nodes('/tag1/tag2[@p1 = "1"]') a(n);
10 сен 19, 22:09    [21968157]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения из XML по xpath  [new]
unno
Member

Откуда:
Сообщений: 119
Еще вот такой вариант нашел
SELECT
  id=c.value('@id[1]','int'),  
  p2=c.value('(tag2[@p1="1"]/@p2)[1]','int')
FROM @xml.nodes('/tag1') t(c)

Спасибо большое за помощь, сильно помогли в понимании процесса
10 сен 19, 23:29    [21968170]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить