Операторы сравнения узлов

Операторы сравнения узлов (node comparison operators), как следует из названия, принимают в качестве типов операндов только узлы.

К операторам сравнения узлов относятся: is – проверка идентичности узлов, << и >> - сравнение позиции элементов относительно порядка документа.

Результатом применения операторов сравнения не всегда является булева переменная. Если в качестве одного или обоих операндов выступает пустая последовательность, результатом будет пустая последовательность.

Например:

declare @xml xmlset @xml = '<a>1</a><a>2</a>'select @xml::query('{-- true - первый узел а предшествует второму --}/a[1] << /a[2], {-- false - первый узел а не предшествует второму --}/a[1] >> /a[2], {-- false - первый узел а не является вторым узлом а --}/a[1] is /a[2]')

В SQL Server реализован еще один оператор сравнения узлов – isnot, который был в рабочих спецификациях в 2002 году, но отсутствует в нынешней рабочей спецификации. Результат его обратен результату оператора is.

Логические операторы

Логические операторы and и or остались на своем месте. Не поменялась ни семантика, ни синтаксис. В качестве типов обоих операндов всегда выступает логический тип – xs:boolean. Если операнд имеет отличный от xs:boolean тип, для него находится действительное булево значение (effective boolean value) путем применения функции fn:boolean.

Функция fn:boolean возвращает false в случае, когда операнд:

  • Пустая последовательность.
  • Логическое значение false.
  • Строка нулевой длины.
  • Числовое значение, равное нулю.
  • Вещественное значение, равное NaN – not a number.

Во всех остальных случаях функция возвращает true.

Например:

declare @xml xmlset @xml = '<a>1</a><a>2</a>'select @xml::query('{-- true - действительное булево значение 2 является true --}true() and 2, {-- false - второй операнд является пустой последовательностью --}true() and (), {-- true - действительное булево значение обоих операндов - true --}"rosa" and "dima", {-- выберет оба узла а --}/a[. = 1 or. = 2]')

К сожалению, SQL Server не захотел принимать этот пример из-за последнего выражения, где выбираются XML-элементы a, выдавая такую ошибку: XQuery: Heterogeneous sequences are not allowed: found 'xs:boolean +' and 'element a *'. Очередной баг.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: