2014-09-20 5 views
8
SELECT * 
FROM 
    TableName 
WHERE 
ORDER BY 
    CASE @OrderByColumn 
    WHEN 1 THEN Forename 
    WHEN 2 THEN Surname 
    END; 

У меня есть инструкция, как указано выше, которая позволяет мне динамически выбирать, как упорядочить результаты запроса. Однако, как я могу указать, что я хочу, чтобы имя Forename было заказано DESC и фамилия ASC?Деловая заявка для заказа По условию с Desc/Asc sort

+1

Пожалуйста, смотрите [это сообщение] (http://sqlperformance.com/2012/08/t-sql-queries/conditional-order-by) и [это может быть интересно прочитать тоже] (http: // blogs. sqlsentry.com/aaronbertrand/sql-variant-use-case/). –

ответ

12

Вы должны разделить ваши ORDER BY в две части:

SELECT * 
FROM 
    TableName 
WHERE 
ORDER BY 
    (CASE @OrderByColumn 
    WHEN 1 THEN Forename 
    END) DESC -- Forename --> descending 
, (CASE @OrderByColumn 
    WHEN 2 THEN Surname 
    END) ASC -- Surname --> ascending 
+0

проголосовали за вас! –

+0

Могу ли я иметь более одного столбца в моем заказе по статье? например 'CASE @OrderByColumn WHEN 1 THEN Forename, Date END DESC' –

+0

@volumeone Не так, нет. Выражение 'CASE' возвращает одно значение, поэтому вам нужно повторить регистр со вторым столбцом после запятой. – dasblinkenlight

3

Вам нужно два пункта в order by:

ORDER BY (CASE WHEN @OrderByColumn = 1 and @Dir = 'ASC' THEN Forename 
       WHEN @OrderByColumn = 2 and @Dir = 'ASC' THEN Surname 
      END) ASC, 
     (CASE WHEN @OrderByColumn = 1 and @Dir = 'DESC' THEN Forename 
       WHEN @OrderByColumn = 2 and @Dir = 'DESC' THEN Surname 
      END) DESC 
Смежные вопросы