Операторы T-SQL IF в предложениях ORDER BY - PullRequest
14 голосов
/ 10 мая 2011

Есть ли способ сделать что-то вроде

@sortType

SELECT
    *
FROM
    table
ORDER BY
    -- if sortType == id
    table.Id
    -- else if sortType == date
    table.Date

Как бы выглядел этот синтаксис?Спасибо.

Ответы [ 4 ]

18 голосов
/ 10 мая 2011

Здесь есть кое-что ... Вы не можете смешивать типы данных в своем операторе case, поэтому вам нужно создать разные группы операторов case для разных типов данных.

SELECT
    *
FROM
    table
ORDER BY
    CASE WHEN @SortType = id THEN table.Id END ASC,
    CASE WHEN @SortType != id THEN table.Date END ASC

Похожие сообщения в блоге:

http://dirk.net/2006/11/14/dynamic-order-by-with-case-statement-in-sql-server-data-type-issues/

5 голосов
/ 10 мая 2011

Никогда не делай что-то подобное. Полученный план запроса должен удовлетворять обоим условиям, поскольку план является общим и не привязан к конкретному значению времени выполнения @variables. Такой план упустит много возможных оптимизаций. Вы должны явно разделить запросы:

@sortType

if @sortType == id
  SELECT
    *
  FROM
    table
  ORDER BY
    table.Id
else if @sortType == date
  SELECT
    *
  FROM
    table
  ORDER BY
    table.Date

Это та же проблема, что и при попытке реализовать условия динамического поиска . Синтаксический сахар использования CASE в ORDER BY на самом деле является блокировщиком оптимизации запросов.

5 голосов
/ 10 мая 2011

Попробуйте

ORDER BY
case when @sortType = 'id' then
table.Id
else 
table.Date end

Внимание. Тем не менее, по соображениям производительности, вероятно, лучше разделить его или использовать динамический sql с sp_executesql

0 голосов
/ 10 мая 2011

или просто приведите дату к целому числу ...

  ... ORDER BY case 
           When @sortType = 'id' Then table.Id 
           Else cast(table.Date As Integer) end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...