Операторы сравнения узлов (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 *'. Очередной баг.