Как использовать ASC / DESC внутри оператора ORDER BY if? - PullRequest
2 голосов
/ 02 января 2012

Вопрос: «Как я могу заказать с помощью оператора SQL, используя значение if?»

У меня есть таблица, в которой у меня есть параметры, и, используя эти параметры, я должен заказать по ASC или DESC один столбец. Как мне этого добиться?

Я понял, что параметры ASC и DESC не могут находиться в блоке IF (и иметь такую ​​структуру, как эта. "IF (Type = '1', rank, rank) ASC / DESC"), то есть альтернатива порядку внутри выбора в базе параметров?

Пример

Таблица выглядит примерно так:

ID | RANKING | TYPE
--------------------
1 | 12 | 1
2 | 10 | 1
3 | 14 | 2
4 | 15 | 2

Тип = 1 должен быть порядком ASC, а Тип = 2 должен быть порядком DESC, поэтому ожидаемый результат моего SELECT может быть:

ID | RANKING | TYPE
--------------------
2 | 10 | 1
1 | 12 | 1
4 | 15 | 2
3 | 14 | 2

Есть идеи по этому поводу?

Ответы [ 3 ]

5 голосов
/ 03 января 2012
ORDER BY type 
       , CASE WHEN type = 1
                THEN ranking 
              ELSE NULL               --- implied, this line can be omitted
                                      --- or changed into:   ELSE ''
                                      --- or:    ELSE someConstant
         END 
       , ranking DESC
3 голосов
/ 03 января 2012

Как насчет заказа по IF(type=2, -ranking, ranking) после заказа по типу?Отрицание рейтинга приведет к обратному порядку для этого типа.

РЕДАКТИРОВАТЬ

Поскольку ranking является столбцом VARCHAR, вам необходимо преобразовать его вчисло, чтобы использовать эту технику.

SELECT * FROM test ORDER BY type ASC, CAST(ranking as SIGNED)*IF(type = 1, 1, -1) ASC;

Вы можете проверить код непосредственно на sqlfiddle

0 голосов
/ 03 января 2012

Не уверен, что вы получаете: «... порядок внутри выбора в базе параметров.»- у вас там случайно несколько слов.

Но если это поможет, вы МОЖЕТЕ упорядочить по нескольким полям, например так:

... ORDER BY type ASC, ranking DESC

и упорядочить по производным значениям:

... ORDER BY IF(ranking = 2, 1, 0) DESC, ranking ASC

, который сначала поместит все записи "rating = 2", а затем все остальные записи ранжирования по возрастанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...