Я пытаюсь пересмотреть свои концепции 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 name, City, Country, case ... from ...
.
Отметьте только базу данных, которую вы используете.
Что сложно понять? Вы можете увидеть ключ сортировки, заменив выражение, хотя я бы упростил его так:
select c.*, coalesce(city, country)
from customers c
order by coalesce(city, country);
В ваших примерных данных все значения country
стоят перед значениями city
в алфавитном порядке.
О, да! Слияние помогло мне понять это! По сути, для сортировки потребовался столбец страны, если город был нулевым. Я проверил это, изменив значение города, чтобы начать с чего-то более продвинутого в алфавитном порядке, что развеяло сомнения. Еще раз спасибо.
Кто-нибудь может объяснить, как здесь работает 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);
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
;
Скопируйте случай в список SELECT, и вы увидите.