Понимание CASE с ORDER BY в SQL

Я пытаюсь пересмотреть свои концепции SQL, и при этом я столкнулся с любопытным случаем, который я не смог понять. Ниже моя схема и данные:

CREATE TABLE Customer 
(
    name varchar(255),
    city varchar(255),
    country varchar(255),
    id int
);

INSERT INTO customer VALUES ("ram923", null, "aIndia3",1);
INSERT INTO customer VALUES ("ram92", null, "dIndia3",1);
INSERT INTO customer VALUES ("ram83", null, "dIndia4",1);
INSERT INTO customer VALUES ("ram94", null, "dIndia4",1);
INSERT INTO customer VALUES ("ram", "city1", "bIndia1",1);
INSERT INTO customer VALUES ("ram1", "city2", "aIndia1",1);
INSERT INTO customer VALUES ("ram2", "city3", "aIndia1",1);
INSERT INTO customer VALUES ("ram3", "city4", "bIndia2",1);
INSERT INTO customer VALUES ("ram4", "city5", "bIndia2",1);
INSERT INTO customer VALUES ("ram8", null, "bIndia2",1);
INSERT INTO customer VALUES ("ram9", null, "bIndia2",1);
INSERT INTO customer VALUES ("ram5", "city6", "cIndia3",1);
INSERT INTO customer VALUES ("ram6", "city7", "dIndia4",1);
INSERT INTO customer VALUES ("ram67", "city71", "dIndia3",1);
INSERT INTO customer VALUES ("ram622", null, "eIndia3",1);
INSERT INTO customer VALUES ("ram81", null, "cIndia3",1);

Затем я выполняю этот запрос выбора, который будет использовать оператор CASE с ORDER BY для упорядочения клиентов по городам. Однако, если City имеет значение NULL, то порядок по стране:

SELECT 
    name, City, Country
FROM
    Customer
ORDER BY
    (CASE
        WHEN City IS NULL THEN Country
        ELSE City
     END);
   

Вывод, который я получаю, не совсем такой, как я думал:

name    City    Country
------------------------
ram923  (null)  aIndia3
ram8    (null)  bIndia2
ram9    (null)  bIndia2
ram81   (null)  cIndia3
ram     city1   bIndia1
ram1    city2   aIndia1
ram2    city3   aIndia1
ram3    city4   bIndia2
ram4    city5   bIndia2
ram5    city6   cIndia3
ram6    city7   dIndia4
ram67   city71  dIndia3
ram92   (null)  dIndia3
ram83   (null)  dIndia4
ram94   (null)  dIndia4
ram622  (null)  eIndia3

Кто-нибудь может объяснить, как здесь работает CASE с ORDER BY? Почему бы не собрать все null города вместе, а затем не сделать ORDER BY страну?

Скопируйте случай в список SELECT, и вы увидите.

jarlh 14.12.2020 21:34

не получил. Можете ли вы ввести запрос, который вы хотите, чтобы я попробовал?

CodeHunter 14.12.2020 21:35

Просто напишите то же самое падежное выражение еще раз, SELECT name, City, Country, case ... from ....

jarlh 14.12.2020 21:38

Отметьте только базу данных, которую вы используете.

forpas 14.12.2020 21:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
162
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что сложно понять? Вы можете увидеть ключ сортировки, заменив выражение, хотя я бы упростил его так:

select c.*, coalesce(city, country)
from customers c
order by coalesce(city, country);

В ваших примерных данных все значения country стоят перед значениями city в алфавитном порядке.

О, да! Слияние помогло мне понять это! По сути, для сортировки потребовался столбец страны, если город был нулевым. Я проверил это, изменив значение города, чтобы начать с чего-то более продвинутого в алфавитном порядке, что развеяло сомнения. Еще раз спасибо.

CodeHunter 14.12.2020 21:42

Кто-нибудь может объяснить, как здесь работает CASE с ORDER BY?

Просто добавьте выражение, используемое в ORDER BY, в список вывода:

SELECT name, City, Country
, CASE WHEN City IS NULL 
       THEN Country
       ELSE City END expression_from_order_by
FROM customer
ORDER BY
(CASE
    WHEN City IS NULL THEN Country
    ELSE City
END);
имя Город Страна выражение_from_order_by баран923 нулевой Индия3 Индия3 баран8 нулевой бИндия2 бИндия2 баран9 нулевой бИндия2 бИндия2 баран81 нулевой cИндия3 cИндия3 баран город1 бИндия1 город1 баран1 город2 Индия1 город2 баран2 город3 Индия1 город3 баран3 город4 бИндия2 город4 баран4 город5 бИндия2 город5 баран5 город6 cИндия3 город6 баран6 город7 dИндия4 город7 баран67 город71 гИндия3 город71 баран92 нулевой гИндия3 гИндия3 баран83 нулевой dИндия4 dИндия4 баран94 нулевой dИндия4 dИндия4 баран622 нулевой еИндия3 еИндия3

db<>рабочий пример здесь

Теперь совершенно ясно, как это работает.

Самый простой способ понять, как выражение case влияет на ваше предложение order by, — это вывести то же выражение case как часть предложения select.

SELECT
      name , City , Country
    ,(
        CASE 
            WHEN City IS NULL
                THEN Country
            ELSE City
            END
        ) AS sort_by_case
FROM Customer
ORDER BY 
        CASE 
            WHEN City IS NULL
                THEN Country
            ELSE City
            END
;

или:

SELECT
      name , City , Country
    ,(
        CASE 
            WHEN City IS NULL
                THEN Country
            ELSE City
            END
        ) AS sort_by_case
FROM Customer
ORDER BY 
      sort_by_case
;

Другие вопросы по теме