2016-03-31 4 views
2

У меня есть таблица на SQL Server, в которой мне нужно выбрать данные, отсортированные по значению. Например,Заказ по нескольким столбцам в SQL Server

  • Если значение сортировки равно 1, тогда мне нужно отсортировать по столбцу1, столбцу2, а затем по столбцу3.

  • Если значение сортировки равно 2, тогда мне нужно отсортировать по столбцу2, column1 и затем столбцу3.

  • Если значение сортировки равно 3, тогда мне нужно отсортировать по столбцу3, column1, а затем по столбцу2.

Может кто-нибудь сказать мне, как я могу добиться этого в SQL без использования, если еще, как показано ниже:

IF @SortOrder = 1 
THEN 
    SELECT * 
    FROM table 
    ORDER BY c1, c2, c3 
END 

IF @SortOrder = 2 
THEN 
    SELECT * 
    FROM table 
    ORDER BY c2, c1, c3 
END 

IF @SortOrder = 3 
THEN 
    SELECT * 
    FROM table 
    ORDER BY c3, c1, c2 
END 
+0

Каковы типы данных column1, column2 и column3? –

ответ

3

вы можете использовать CASE EXPRESSION для условного заказа:

SELECT * FROM Table 
ORDER BY CASE WHEN @SortOrder = 1 then c1 
       WHEN @SortOrder = 2 then c2 
       ELSE c3 
     END, 
     CASE WHEN @SortOrder = 1 then c2 
       ELSE c1 
     END, 
     CASE WHEN @SortOrder in(1,2) then c3 
       ELSE c2 
     END 
+0

Я пробовал это. Но поскольку мой первый столбец (c1) имеет тип даты. Следовательно, он выдает ошибку, поскольку «Конверсия не удалась при преобразовании даты и/или времени из символьной строки». – Bhavika

+0

Это не означает, что нужно даже разговаривать, поэтому это не имеет большого смысла. Нет проблем с упорядочением по столбцу даты. @Bhavika – sagi

+0

@sagi Я рассматривал возможность писать то же самое. Если конфликтуют типы столбцов. Это не сработает –

0

Может быть, попробовать что-то вроде этого: select * from table order by @SortOrder,c1,c2,c3 , если значение представляет собой порядок столбцов, иначе вы ван попробуйте добавить смещение (например @SortOrder + 4)

+0

Нет .. это не работает. – Bhavika

0

Вы можете использовать оператор CASE в своем предложении ORDER BY и COALESCE значения. (Обратите внимание, что вы должны, возможно, потребуется проверить производительность на использовании этой установки. Я, как правило, не имеют проблем, но понял, что я хотел бы отметить это.)

SELECT * 
FROM [TABLE] 
ORDER BY 
    CASE @SortOrder 
    WHEN 1 THEN COALESCE(c1, N'') + N'-' + COALESCE(c2, N'') + N'-' + COALESCE(c3, N'') 
    WHEN 2 THEN COALESCE(c2, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c3, N'') 
    WHEN 3 THEN COALESCE(c3, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c2, N'') 
     END 

Или, если вы хотите значение, отсортированных на будут возвращены в результатах (но столбец сортировки должен быть первый столбец)

SELECT 
    CASE @SortOrder 
    WHEN 1 THEN COALESCE(c1, N'') + N'-' + COALESCE(c2, N'') + N'-' + COALESCE(c3, N'') 
    WHEN 2 THEN COALESCE(c2, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c3, N'') 
    WHEN 3 THEN COALESCE(c3, N'') + N'-' + COALESCE(c1, N'') + N'-' + COALESCE(c2, N'') 
     END AS SortOrder 
    * 
FROM [TABLE] 
ORDER BY 1 
0

Я думаю dynamic query является лучшим подходом здесь условно заказа

DECLARE @sql  VARCHAR(max), 
     @SortOrder INT = 2 

SET @sql = 'select * from table order by ' 
      + CASE @SortOrder WHEN 1 THEN 'c1,c2,c3' WHEN 2 THEN 'c2,c1,c3' WHEN 3 THEN 'c3,c1,c2' END 

--print @sql 
exec (@sql) 
3

Us CASE правильно. Этот синтаксис нужен, если тип данных конфликтует в столбцах (c1, c2, c3).

ORDER BY 
    CASE WHEN @SortOrder = 1 THEN c1 END, 
    CASE WHEN @SortOrder = 1 THEN c2 END, 
    CASE WHEN @SortOrder = 1 THEN c3 END, 
    CASE WHEN @SortOrder = 2 THEN c2 END, 
    CASE WHEN @SortOrder = 2 THEN c1 END, 
    CASE WHEN @SortOrder = 2 THEN c3 END, 
    CASE WHEN @SortOrder = 3 THEN c3 END, 
    CASE WHEN @SortOrder = 3 THEN c1 END, 
    CASE WHEN @SortOrder = 3 THEN c2 END 
+0

Это работало очень хорошо для меня. Большое спасибо. :) – Bhavika

+0

никаких проблем, пожалуйста, не забудьте отметить этот ответ как принятый ответ –

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