SQL Order By со случаем, когда - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь понять ORDER BY с CASE WHEN .

Моя цель - понять это фундаментально, потому что у меня были созданы разные варианты использования

Моя базовая таблица выглядит следующим образом

|   Name |
|--------|
|    BPM |
|    BXR |
| Others |
|    XZA |
|    XYZ |
|    PQR |
|    ABC |

Запрос 1: Базовый ORDER BY

SELECT * 
FROM City 
ORDER BY Name

Результат 1: выдан правильный вывод, как показано ниже (столбец Имя отсортирован в порядке возрастания)

|   Name |
|--------|
|    ABC |
|    BPM |
|    BXR |
| Others |
|    PQR |
|    XYZ |
|    XZA |

Запрос 2: я хочу Others наконец

SELECT * 
FROM City
ORDER BY CASE 
         WHEN Name = 'Others' THEN 1
         ELSE 0
         END

Результат запроса 2: Я получил частично правильный результат. Я получил Others наконец, но другие names Я ожидал, что это будет в порядке возрастания. Они на самом деле выглядят так, как они находятся в базовой таблице.

|   Name |
|--------|
|    BPM |
|    BXR |
|    XZA |
|    XYZ |
|    PQR |
|    ABC |
| Others |

Я также не понимаю, что на самом деле означают 0 и 1 в ORDER BY оператор.

Запрос 3: я хочу, наконец, BXR и Others.

 SELECT * 
    FROM City
    ORDER BY CASE
             WHEN Name = 'BXR' THEN 1
             WHEN Name = 'Others' THEN 2
             ELSE 0
             END

Результат запроса 3: Я получил частично правильный результат. Я получил 'Другие' и 'BXR 'наконец, но другие Name не в алфавитном порядке. То же, что и в Query 2. Здесь также я не понимаю значение 0, 1, 2

|   Name |
|--------|
|    BPM |
|    XZA |
|    XYZ |
|    PQR |
|    ABC |
|    BXR |
| Others |

Запрос 4: Я хочу Others и PQR сверху.

SELECT * 
FROM City
ORDER BY CASE
         WHEN Name = 'PQR' THEN 0
         WHEN Name = 'Others' THEN 1
         ELSE 2
         END

Запрос 4 Результат: Я получаю PQR и Others сверху, но остальные имена не в алфавитном порядке.

|   Name |
|--------|
|    PQR |
| Others |
|    BPM |
|    BXR |
|    XZA |
|    XYZ |
|    ABC |

Мое предположение о 0, 1, 2 состоит в том, что они являются просто числами, решающими "порядок ", в котором должна быть запись.(Запись, имеющая 0, должна сохраняться первой, а если все остальные записи имеют 1, то должна быть отсортирована в алфавитном порядке) (Если есть «0», «1», «2», в записи с 0 должно быть сначала, запись с1 должен быть вторым, все остальные записи, имеющие 2 должны быть отсортированы в алфавитном порядке)

Исправьте меня, если я ошибаюсь с этим

SQLFiddle

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Мы также можем ORDER BY, используя FIELD:

SELECT * 
FROM City
ORDER BY FIELD(Name, 'Others', 'PQR') DESC, name;

enter image description here

Демо

Поведение FIELD таково, что оно вернет 1 для Others, 2 для PQR и 0 для любого другого имени.Итак, мы используем нисходящий порядок, чтобы убедиться, что сначала отображается PQR, затем Others и все остальные имена.

0 голосов
/ 23 октября 2018

Вы можете оставить столбец name в случае else как:

SELECT * 
FROM City
ORDER BY CASE
         WHEN Name = 'PQR' THEN 0
         WHEN Name = 'Others' THEN 1
         ELSE Name
         END

, поскольку всегда числа имеют приоритет над алфавитами.

Демонстрация SQL Fiddle

0 голосов
/ 23 октября 2018

Вам необходимо добавить имя также по порядку:

DEMO

SELECT * 
FROM City
ORDER BY CASE
         WHEN Name = 'PQR' THEN 0
         WHEN Name = 'Others' THEN 1
         ELSE 2
         END,name

ВЫХОД:

**Name**

PQR
Others
ABC
BPM
BXR
XYZ
XZA
...