2016-11-16 4 views
0

Я пытаюсь определить порядок сортировки ASC/DESC, определяемый параметром в хранимой процедуре.Ошибка в предложении ORDER BY с использованием CASE WHEN

После большого количества исследований, я нашел этот подход (с упрощением):

SELECT * 
FROM MyTable 
ORDER BY CASE WHEN @reverse = 1 THEN 
       MyColumn 
     END DESC, 
     CASE WHEN @reverse = 0 THEN 
       MyColumn 
     END ASC 

Однако этот код выдает следующее сообщение об ошибке:

Msg 408, Level 16, State 1, Line 8
A constant expression was encountered in the ORDER BY list, position 2.

Почему это происходит? Очевидно, что MyColumn не является константой - это имя столбца.

Использование SQL Server 2016 в режиме совместимости 2016 (130)

Благодаря

+1

Ваше второе выражение 'CASE' всегда' NULL', так как единственным условием является 'WHEN 1 = 0', и это всегда false, и вы не сделали этого определите 'ELSE' – Lamak

+0

@radders. Проверьте приведенное ниже решение, которое будет работать для вас. Просто отправьте фильтр как строку в usp и соедините его с запросом, после чего вы сможете получить результат, выполнив новый запрос (с фильтром) используя EXEC («Запрос с фильтром DESC или ASC») –

+0

@ Lamak, если вы посмотрите на отредактированный OP, вы увидите, что WHEN не всегда NULL - только один из двух из них будет, в зависимости от значения переменной BIT. – radders

ответ

1

После some search this line helped me понять больше ..

ordering by an expression must evaluate to a constant

так Lamak отметил, 1=0 оценивается как ложное и вы Бесполезный 't определить условие else..so null не определено и оно вызывает ошибку

, чтобы избавиться от этой попытки ниже

ORDER BY CASE WHEN 1 = 1 THEN 
       MyColumn 
     END DESC, 
     CASE WHEN 1 = 0 THEN 
       col2 else col2--not your column,added this to make example clearer 
     END ASC 

также остерегаться выражения в порядке по должны быть уникальными, поэтому ваш запрос не будет работать (даже если это удастся) и бросает другую ошибку, вы можете использовать ISNULL, а

+0

Но ваше условие такое же, как 'ORDER BY MyColumn DESC, MyColumn ASC', эффективно упорядочивая только' MyColumn DESC' – Lamak

+0

@Lamak: yes thats right , Я добавлю еще – TheGameiswar

+0

Я сказал, что упростил; реальный запрос выглядит как отредактированная версия выше – radders

0

Реальный базовый причина всего этого горя является тот факт, что:

ORDER BY MyColumn ASC 

требует

ASC 

- жестко закодированная строка (например, SELECT, FROM и т. Д.) И не может быть строкой . ; - ((

Для того чтобы преодолеть это ограничение, и проблемы, вызванные пытаются использовать СЛУЧАЙ, чтобы преодолеть его, я сделал 95% от запроса заполнить таблицу-переменную, то у меня есть один из два запроса, которые выбрали из него с правильным предложением ORDER BY.

Смежные вопросы