С сортировкой всегда была проблема. Редакторы спецификации все никак не могли решить – является ли она частью FLWR-выражения или нет. Если нет, то это должна быть универсальная конструкция, позволяющая сортировать любую последовательность. Подобное описание сортировки с использованием ключевого слова sortby можно найти в [10]. В SQL Server-е реализован именно такой метод, правда, с серьезным ограничением (или багом).
declare @xml xmlset @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 xmlset @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/@breturn $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.