Сортировка. С сортировкой всегда была проблема

С сортировкой всегда была проблема. Редакторы спецификации все никак не могли решить – является ли она частью 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.


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



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