Инструкция CASE WHEN для предложения ORDER BY

Я использую SQL Server 2008 R2.

Я хочу сортировку на основе приоритетов для записей в таблице.

Так что я использую оператор CASE WHEN в предложении ORDER BY. Предложение ORDER BY выглядит следующим образом:

ORDER BY 
CASE WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount desc, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END, 
CASE WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount desc, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END,
Case WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount DESC, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END,
CASE WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount DESC, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END,
Case WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount DESC, TblList.LastName ASC, TblList.FirstName ASC, Patlist.MiddleName ASC END

Но это дает Incorrect syntax near the keyword 'desc'

Любое решение?

Также я могу иметь:

TblList.PinRequestCount <> 0 and TblList.HighCallAlertCount <> 0 and
TblList.HighAlertCount <> 0' and TblList.MediumCallAlertCount <> 0 and  
TblList.MediumAlertCount <> 0 

в то же время.

Ответы

Ответ 1

CASE - выражение - оно возвращает одно скалярное значение (для каждой строки). Он не может возвращать сложную часть дерева синтаксиса чего-то еще, как предложение ORDER BY оператора SELECT.

Похоже, вам просто нужно:

ORDER BY 
CASE WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount END desc,
CASE WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount END desc, 
Case WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount END DESC,
CASE WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount END DESC,
Case WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount END DESC,
TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC

Или, возможно:

ORDER BY 
CASE
   WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount
   WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount
   WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount
   WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount
   WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount
END desc,
TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC

Немного сложно рассказать, какой из вышеперечисленных (или что-то еще) - это то, что вы ищете, потому что вы a) не объяснили, какой фактический порядок сортировки вы пытаетесь достичь, и b) не предоставил никаких образцы данных и ожидаемые результаты, из которых мы могли бы попытаться вывести фактический порядок сортировки, который вы пытаетесь достичь.


Это может быть ответ, который мы ищем:

ORDER BY 
CASE
   WHEN TblList.PinRequestCount <> 0 THEN 5
   WHEN TblList.HighCallAlertCount <> 0 THEN 4
   WHEN TblList.HighAlertCount <> 0 THEN 3
   WHEN TblList.MediumCallAlertCount <> 0 THEN 2
   WHEN TblList.MediumAlertCount <> 0 THEN 1
END desc,
CASE
   WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount
   WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount
   WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount
   WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount
   WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount
END desc,
TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC

Ответ 2

Еще один простой пример отсюда..

SELECT * FROM dbo.Employee
ORDER BY 
 CASE WHEN Gender='Male' THEN EmployeeName END Desc,
 CASE WHEN Gender='Female' THEN Country END ASC

Ответ 3

Вам нужно поставить END для завершения каждого CASE (до desc)

Ответ 4

Хотя это довольно старая статья, я хотел бы поделиться своим недавним моментом ясности здесь, так как больше нигде не смог ее найти.

ЗАКАЗАТЬ НА СЛУЧАЕ, КОГДА ww = xx ТОГДА ГГЕ ПРОСТО zz END

Может быть переведено как 'order by zz после замены zz на yy, где ww = xx'.

Вот пример из реальной жизни... https://richardbriansmith.wordpress.com/2019/01/28/order-by-case/

Ответ 5

declare @OrderByCmd  nvarchar(2000)
declare @OrderByName nvarchar(100)
declare @OrderByCity nvarchar(100)
set @OrderByName='Name'    
set @OrderByCity='city'
set @OrderByCmd= 'select * from customer Order By '[email protected]+','[email protected]+''
EXECUTE sp_executesql @OrderByCmd