Задавая другой вопрос , я обнаружил, что SQL Server (происходит как в 2005, так и в 2008 году), похоже, ведет себя странно и непоследовательно при работе с Операторы CASE
в разделах оконных функций. Следующий код дает ошибку:
declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0
select row_number() over (order by
case when 1=1 then SortColumn end asc,
case when 1=0 then SortColumn end desc) RowNumber
, *
from @t
Ошибка Оконные функции не поддерживают константы как выражения предложения ORDER BY. Я предполагаю, что это связано с тем, что оператор case
может оценивать значение NULL
, которое является константой. Как и следовало ожидать, этот код дает ту же ошибку:
declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0
select row_number() over (order by
NULL asc,
NULL desc) RowNumber
, *
from @t
... предположительно по той же причине. Однако этот код не выдает ошибки:
declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0
select row_number() over (order by
case when @asc=1 then SortColumn end asc,
case when @asc=0 then SortColumn end desc) RowNumber
, *
from @t
Единственное отличие здесь от первого кодового блока состоит в том, что я переместил один из условных операндов операторов case в переменную,
@asc
. Теперь это нормально работает. Но почему? Операторы case
могут по-прежнему оцениваться как NULL
, что является константой, поэтому это не должно работать ... но работает. Это как-то согласованно, или это особый случай поведения, установленного Microsoft?
Все это поведение можно проверить, поиграв с этим запросом .
Обновление: Это ограничение не соответствует ' t применимо только к предложениям OVER
(хотя они дают другую ошибку) - это применимо ко всем предложениям ORDER BY
, начиная с SQL Server 2005. Вот запрос , который также показано ограничение с помощью обычного предложения SELECT
ORDER BY
.