2013-07-29 2 views
2

У меня есть оператор select, где я хочу заказать по различным критериям на основе выражения CASE, но у меня возникают проблемы с синтаксисом, когда я хочу заказать по нескольким критериям. Я хотел бы, чтобы он был похож на следующий код, но я получаю синтаксические ошибки.ORDER BY с двумя критериями в выражении CASE

SELECT * 
FROM Table1 
ORDER BY 
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END, 
CASE WHEN @OrderBy = 2 THEN Column3 END, 

ответ

4

Хотя case возвращает только одно значение, вы можете повторить случай:

SELECT * 
FROM Table1 
ORDER BY (CASE WHEN @OrderBy = 1 THEN Column1 
       WHEN @OrderBy = 2 THEN Column3 
      end), 
     (CASE WHEN @OrderBy = 1 THEN Column2 END) 

Это дает вторичный вид на Column2 для @OrderBy = 1.

На самом деле, это также будет работать, и это может быть ближе к тому, что вы изначально думал:

SELECT * 
FROM Table1 
ORDER BY (CASE WHEN @OrderBy = 1 THEN Column1 end), 
     (CASE WHEN @OrderBy = 1 THEN Column2 end), 
     (CASE WHEN @OrderBy = 2 THEN Column3 end) 

В этой версии, первые два пункта будут возвращать NULL для всех строк на значение 2. Затем будет вызываться третья строка для сортировки.

4

CASEявляется выражением который возвращает точно один результат, и не может быть использован для управления правового потока логики, как и в некоторых других языках. Я понятия не имею, что ваши типы данных, так что я предполагаю, что Вы хотите:

CASE WHEN @OrderBy = 1 THEN Column1 END, 
CASE WHEN @OrderBy = 2 THEN Column3 END, 
Column2; 

Если Column1 и Column3 имеют одинаковые (или совместимые) типы данных, можно упростить:

CASE @OrderBy 
    WHEN 1 THEN Column1 
    WHEN 2 THEN Column3 END, 
Column2; 

Вы можете просто добавить Column2 в конец, потому что ему не требуется условное - это второе условие для первого условия, и если вы заботитесь только о столбце 3 для второго условия, то, вероятно, не имеет значения, что вы также заказываете Column2.

0
SELECT * 
FROM Table1 
ORDER BY 
CASE WHEN @OrderBy = 1 THEN Column1 else Column3 END, 
Column2 
+3

это работает только если Column1 и Column3 имеют совместимые типы данных. –

+0

Согласен, но, надеюсь, оригинальный плакат понимает 'CAST' и/или' CONVERT'. –

+3

Я просто говорю, что, как написано, он может вернуться с ошибкой преобразования типа данных. Обычно полезно опубликовать такой отказ от ответственности, а не просто предположить, что ОП поймет, что делать ... –

2

Сформировать предложения ORDER BY на клиенте, или использовать динамический SQL

Для примера:

DECLARE @sql VARCHAR(1000) 
    SET @sql = 'SELECT * FROM Table1 {order}'; 
    SET @sql = CASE WHEN @orderBY = 1 THEN REPLACE(@sql, '{order}', 'ORDER BY column1, column2') 
        WHEN @orderBY = 2 THEN REPLACE(@sql, '{order}', 'ORDER BY column3') 
      END 
    -- by default value replace {order} to empty string 
    .... 

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

  • Нет связанных вопросов^_^