Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Использование XML совместно с SQL.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

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

В XQuery (а точнее, в XPath 2.0) существует три типа операторов сравнения: общие операторы сравнения, операторы сравнения атомарных значений и операторы сравнения узлов.

Операторы сравнения атомарных значений

Операторы сравнения атомарных значений (value comparision operators) – новый тип операторов, тип операндов которых ограничен атомарными значениями, т.е. в качестве операндов не могут выступать последовательности.

К ним относятся eq – равно, ne – не равно, lt – меньше, gt – больше, le – меньше или равно, ge – больше или равно.

Типы операндов должны быть одинаковыми.

Примеры:

declare @xml xml

set @xml = '<a>1</a><a>2</a>'

select @xml::query('

{-- true --}

sum(/a) ge 2,

{-- true --}

/a[1] ge 1

')

Общие операторы сравнения

Общие операторы сравнения (general comparision operators) больше всего напоминают операторы сравнения XPath 1.0. Различие заключается в том, что новые операторы работают с последовательностями элементов.

К общим операторам сравнения относятся <, >, <=, >=, = и !=.

Когда общий оператор применяется к двум последовательностям элементов, результатом является истина в том случае, если хотя бы один элемент в первой последовательности удовлетворяет соответствующему условию, примененному к любому элементу второй последовательности. Фактически, это то же самое правило, которое действовало в XPath 1.0, когда операндами оператора сравнения были наборы узлов. Что означает данное правило на практике? Данный оператор сравнения берет поочередно каждый элемент первой последовательности и применяет соответствующий атомарный оператор сравнения к каждому элементу из второй последовательности. Как видно, это довольно медленная операция. Ее трудоемкость достаточно велика – O(n*m), где n – размер первой последовательности и m – размер второй. Правда, процессор вовсе не обязан просматривать все элементы обоих последовательностей – он может завершить работу сразу же, как только для какой-либо пары оператор сравнения вернет истинное значение.

Несколько примеров:

declare @xml xml

set @xml = '<a>1</a><a>2</a>'

select @xml::query('

{--

false – нет ни одного элемента из первой последовательности, меньшего,

чем любой элемент из второй последовательноси

--}

(10, 20, 30) < (1, 2)

,

{--

true - первый элемент первой последовательности меньше последнего

элемента второй последовательности

--}

(10, 20, 30) < (1, 20)

,

{--

true - последний элемент первой последовательности равен

единственному элементу второй последовательности

--}

(1, 2, 3) = (3)

,

{--

true - последний элемент первой последовательности равен

единственному элементу второй последовательности

/a - возвращает последовательность из двух элементов

--}

/a = 2

')

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

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

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

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

Например:

declare @xml xml

set @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.