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

Кванторные выражения

Кванторные выражения делятся на два типа: квантор существования, при котором определяется истинность условия для любого элемента последовательности, и квантор общности, при котором определяется истинность условия для каждого элемента последовательности.

Синтаксис выражения следующий:

( "some" | "every" ) Variable "in" Expression "satisfies" Expression

Где:

  • Variable – имя переменной.

  • Expression – выражение XQuery, возвращающее последовательность.

Кванторное выражение служит примерно тем же целям, что и ключевые слова SOME и ANY в SQL. Например, следующий запрос возвращает все элементы а, которые больше всех элементов b:

declare @xml xml

set @xml = '<a>10</a>, <a>5</a>, <b>4</b>, <a>3</a>, <b>6</b>'

select @xml::query('

for $a in /a

where every $b in /b

satisfies xs:integer($b) < xs:integer($a)

return $a

')

Результат:

<a>10</a>

Для большей наглядности перепишем предыдущий пример на SQL:

--создание таблицы

create table test(a int, b int)

--наполнение ее данными

insert into test values(1, 2)

insert into test values(1, 3)

insert into test values(4, 1)

--запрос, возвращающий все значения поля а, которое больше

--любого значения поля b

select a from test4 where a > any (select b from test4)

Сортировка

С сортировкой всегда была проблема. Редакторы спецификации все никак не могли решить – является ли она частью FLWR-выражения или нет. Если нет, то это должна быть универсальная конструкция, позволяющая сортировать любую последовательность. Подобное описание сортировки с использованием ключевого слова sortby можно найти в [10]. В SQL Server-е реализован именно такой метод, правда, с серьезным ограничением (или багом).

declare @xml xml

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

select @xml::query('/a sortby (. descending)')

Здесь оператор sortby применяется к последовательности узлов а и сортирует их по их содержимому в порядке убывания. Этот оператор может сортировать любую последовательность, однако в следующем примере SQL Server видит какой-то подвох, и исполнять его отказывается, выдавая сообщение об ошибке: XQuery: Operand of 'sortby' has invalid type.

declare @xml xml

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

select @xml::query('(1, 2, 3) sortby (. descending)')

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

Надо сказать, что в текущей версии рабочего черновика стандарта оператор sortby отсутствует. Его заменил оператор order by в конструкции FLWOR. Функциональность от этого совершенно не пострадала. Например, предыдущие запросы переписываются так:

(: сортировка элементов а по их содержимому в обратном порядке :)

for $a in /a

order by $a descending

return $a

(: сортировка последовательности :)

for $a in (1, 2, 3)

order by $a descending

return $a

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

Выполнять сортировку можно по нескольким критериям (ordering specifications). Например:

for $a in (<a b="2">1</a>, <a b="1">1</a>, <a b="1">2</a>)

order by $a, $a/@b

return $a

Здесь сначала выполняется сортировка по значению узла элемента а, а затем – по значению узла атрибута b.

Результат:

<?xml version="1.0" encoding="utf-16"?><a b="1">1</a>

<a b="2">1</a>

<a b="1">2</a>

При сортировке строковых элементов последовательности можно указывать collation, которое будет использоваться при сравнении соответствующих значений. К другим параметрам сортировки относятся:

  • stable order by – устойчивая сортировка. Этот тип сортировки сохраняет оригинальный порядок элементов последовательности в случае, когда они равны (более точный термин – эквивалентны). Устойчивая сортировка выполняется чуть дольше.

  • empty (greatest | least) – указывает, где будут появляться элементы, ключ сортировки которых содержит пустую последовательность (в начале или конце).

Ни один из этих параметров сортировки не поддерживается в SQL Server.