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

declare
	@x xml =
	N'
		<n>
			<q1 a1="aaa1" a2 ="aaa2" />
			<m>
				<q2 a1="aaa3" a2="aaa4" />
			</m>
		</n>
	';


Нужно вернуть 1, если /n/q1/@a1 = /n/m/q2/@a1 and /n/q1/@a2 = /n/m/q2/@a2. Как красивше сделать на xquery? Сейчас сделал залипуха вытаскиваю значения атрибутов и их сравниваю отдельно.
27 ноя 14, 10:13    [16912110]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
оппа говносайт
Guest
еще такой вариант придумал, может красивше можно?

select @x.value
(
	N'
		if 
		(
			(/n/q1/@a1)[1] eq (/n/m/q2/@a1)[1] and
			(/n/q1/@a2)[1] eq (/n/m/q2/@a2)[1]
		)
			then "1"
		else
			"0"
	',
	'nvarchar(max)'
)
27 ноя 14, 10:38    [16912237]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
оппа говносайт
Guest
чуть проще, как бы там ни было. может можно красивше? плохо что = скорее похож на in для сиквенсов

select @x.value
(
	N'
		(/n/q1/@a1)[1] eq (/n/m/q2/@a1)[1] and
		(/n/q1/@a2)[1] eq (/n/m/q2/@a2)[1]
	',
	'bit'
)
27 ноя 14, 10:40    [16912245]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
if 
       @x.value('(//q1)[1]/@a1','varchar(10)') = @x.value('(//q2)[1]/@a1','varchar(10)')
and        
      @x.value('(//q1)[1]/@a2','varchar(10)') = @x.value('(//q2)[1]/@a2','varchar(10)') 
select 1 else select 0
27 ноя 14, 10:55    [16912331]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
PA
Member

Откуда: Санкт-Петербург
Сообщений: 4146
оппа говносайт,

select @x.exist('/n/q1[@a1 = ../m/q2/@a1 and @a2 = ../m/q2/@a2]')
27 ноя 14, 13:12    [16913171]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
Хитрый жук
Member

Откуда:
Сообщений: 9
Универсальный запрос, который сравнивает по всем узлам атрибут в атрибут

select @x.query('count(distinct-values(for $a in //*/@* return concat(local-name($a), data($a)))) eq min(for $a in //*/@* return count($a/../@*))')
27 ноя 14, 13:41    [16913420]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
оппа говносайт
Guest
PA,

огромное спасибо. отличный вариант.
27 ноя 14, 13:48    [16913497]     Ответить | Цитировать Сообщить модератору
 Re: xquery как лучше сделать?  [new]
оппа говносайт
Guest
Хитрый жук
Универсальный запрос, который сравнивает по всем узлам атрибут в атрибут

select @x.query('count(distinct-values(for $a in //*/@* return concat(local-name($a), data($a)))) eq min(for $a in //*/@* return count($a/../@*))')


круто. спасибо. приму на вооружение.
27 ноя 14, 13:50    [16913507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить