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

Откуда:
Сообщений: 442
есть xml вида:
<book>
<info1>1</info1>
<info2>1</info2>
<infoN>1</infoN>
<page number="1">1</page>
<page number="2">2</page>
<page number="3">3</page>
</book>


нужно получить три XML, исключив из исходного XML все страницы кроме одной, при этом оставив все info теги.
12 ноя 13, 15:42    [15116046]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
qwerty112
Guest
BERSERC
нужно получить три XML, исключив из исходного XML все страницы кроме одной, при этом оставив все info теги.

а сделать "тупо", не вариант ?
declare @xml xml
declare @xml1 xml, @xml2 xml, @xml3 xml

set @xml =
'<book>
<info1>1</info1>
<info2>1</info2>
<infoN>1</infoN>
<page number="1">1</page>
<page number="2">2</page>
<page number="3">3</page>
</book>'

set @xml1=@xml
set @xml2=@xml
set @xml3=@xml

set @xml1.modify('delete book/page[@number!=1]')
set @xml2.modify('delete book/page[@number!=2]')
set @xml3.modify('delete book/page[@number!=3]')

select @xml1, @xml2, @xml3
12 ноя 13, 16:06    [15116268]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Вариант конечно, но хотелось бы что б данный вариант был совмещен с cross apply, т.е. на основе nodes и query)
12 ноя 13, 16:13    [15116364]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
DECLARE @XML XML = N'
<book>
  <info1>1</info1>
  <info2>1</info2>
  <infoN>1</infoN>
  <page number="1">1</page>
  <page number="2">2</page>
  <page number="3">3</page>
</book>'

SELECT	@XML.query('element book { /book/@*, /book/*[local-name() != "page"], /book/page[1] }')
,	@XML.query('element book { /book/@*, /book/*[local-name() != "page"], /book/page[2] }')
,	@XML.query('element book { /book/@*, /book/*[local-name() != "page"], /book/page[3] }')
/book/@* - если вдруг есть/появятся атрибуты (у book).
12 ноя 13, 21:29    [15118079]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Mnior,Спасибо! Супер!)
13 ноя 13, 13:24    [15121156]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
если страниц произвольное кол-во то можно вернуть XML строками по числу страниц
DECLARE @XML XML = N'
<book>
  <info1>1</info1>
  <info2>1</info2>
  <infoN>1</infoN>
  <page number="1">1</page>
  <page number="2">2</page>
  <page number="3">3</page>
  <page number="4">4</page>
  <page number="5">5</page>
  <page number="6">6</page>
</book>'
SELECT @XML.query('element book { /book/@*, /book/*[local-name() != "page"], /book/page[sql:column("N")] }')
FROM (SELECT c.value('text()[1]','int') N FROM @XML.nodes('//page') t(c))T
13 ноя 13, 13:39    [15121294]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Mnior,

а как-то без for можно обойтись тут?

DECLARE @XML XML = N'
<book a="9">
  <info1>1</info1>
  <info2>1</info2>
  <infoN>1</infoN>
  <page number="1">1</page>
  <page number="2">2</page>
  <page number="3">3</page>
</book>'

SELECT	c.query('element book{/book/@*, /book/*[local-name() != "page"],for $o in . , $n in /book/page[@number = $o/@number ] return $o }')
from @XML.nodes('book/page') as t(c)
13 ноя 13, 14:14    [15121381]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
BERSERC, вы издеваетесь? Зачем он там нужен?
Вообще забудьте про этот FOR! Он нужен раз в жизни за всю историю человечества, и никто не знает когда понадобится.
DECLARE @XML XML = N'
<book a="9">
  <info1>1</info1>
  <info2>1</info2>
  <infoN>1</infoN>
  <page number="1">1</page>
  <page number="2">2</page>
  <page number="3">3</page>
</book>'

SELECT	P.X.query('element book { /book/@*, /book/*[local-name() != "page"], . }')
FROM	@XML.nodes('/book/page') AS P(X)
13 ноя 13, 21:11    [15124607]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Еще как вариант:
DECLARE
  @xml XML = N'
<book a="9">
  <info1>1</info1>
  <info2>1</info2>
  <infoN>1</infoN>
  <page number="1">1</page>
  <page number="2">2</page>
  <page number="3">3</page>
</book>';
;with cte as (
  select
    t.n.value('.', 'varchar(1)') n
  from @xml.nodes('/book/page/text()') t(n)
)
select
  @xml.query('element book { /book/*[not(self::page and text()!=sql:column("n"))] }')
from cte
14 ноя 13, 06:08    [15125450]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Всем спасибо! )))
14 ноя 13, 12:18    [15126995]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать выборку из XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сон Веры Павловны,

с подвывертами. Зачёт.
14 ноя 13, 16:51    [15129913]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить