SQL CASE в SQL є умовним оператором, який перевіряє кілька умов послідовно та повертає результат для першої умови, яка задоволена зі списку умов.
Синтаксис:
Синтаксис оператора CASE виглядає так:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN condition-n THEN result-n
ELSE condition-m
END;
Приклад використання оператора CASE:
Розглянемо приклад:
У нас є 2 таблиці, які зберігають інформацію про клієнтів та їх відповідні деталі замовлень, як показано нижче:
Задача: Отримати замовлення, зроблені кожним клієнтом, а також додати стовпець під назвою "Куплено/Не куплено", який вказує, чи зробив клієнт покупку.
Для стовпця "Куплено/Не куплено" можна використовувати оператор CASE, щоб перевірити, чи існує customer_id
(зовнішній ключ) у таблиці Orders.
Запит виглядатиме так:
SELECT C.customer_id, C.first_name, C.last_name,O.item, O.amount,
(CASE WHEN item IS NOT NULL THEN 'Purchased'
ELSE 'Not Purchased'
END) AS "Purchased/Not Purchased"
FROM Customers C LEFT JOIN Orders O
ON C.customer_id = O.customer_id;
У наведеному запиті ми використовуємо LEFT JOIN на таблицю Customers, щоб результат включав також клієнтів, які не зробили жодного замовлення. Для таких клієнтів значення в стовпцях item та amount будуть порожніми, а в стовпці "Purchased/Not Purchased" буде виведено "Not Purchased":
Вкладений оператор CASE:
Як випливає з назви, вкладений оператор CASE може обробляти кілька умов залежно від батьківських умов, подібно до вкладеного дерева.
Синтаксис для вкладеного оператора CASE:
CASE
WHEN condition1 THEN
(CASE WHEN sub-condition1 THEN result1
WHEN sub-condition2 THEN result2
END)
ELSE condition-m
END;
Приклад:
Розглянемо той самий приклад "Куплено/Не куплено", що згадувався раніше. Тут ми хочемо додати ще одну умову для перевірки, чи була покупка великою, тобто якщо сума покупки більше за 1000, або маленькою, коли сума менш ніж 1000.
Метою є отримати стовпець: Куплено/Не куплено — Розмір, який покаже значення "Purchased — Big", якщо сума покупки > 1000, або "Purchased — Small", якщо сума менша.
Це можна досягти за допомогою наступного запиту:
SELECT C.customer_id, C.first_name, C.last_name,O.item, O.amount,
(CASE WHEN item IS NOT NULL THEN
(CASE WHEN O.amount > 1000 THEN 'Purchased - Big'
ELSE 'Purchased - Small' END)
ELSE 'Not Purchased'
END) AS "Purchased/Not Purchased - Size"
FROM Customers C
LEFT JOIN Orders O
ON C.customer_id = O.customer_id;
У цьому запиті ми додали додаткову вкладену умову для перевірки суми та визначення розміру покупки.
Результат виконання цього запиту виглядає так:
💡Альтернатива для вкладеного оператора CASE:
Ми можемо використовувати альтернативу для вкладеного оператора CASE, застосувавши логічні оператори замість цього.
Цей запит дасть нам точно такий самий результат, як показано вище:
SELECT C.customer_id, C.first_name, C.last_name,O.item, O.amount,
(CASE WHEN item IS NOT NULL AND O.amount > 1000 THEN 'Purchased - Big'
WHEN item IS NOT NULL AND O.amount < 1000 THEN 'Purchased - Small'
ELSE 'Not Purchased'
END) AS "Purchased/Not Purchased - Size"
FROM Customers C
LEFT JOIN Orders O
ON C.customer_id = O.customer_id;
Не соромтесь поділитися своїми запитаннями з цього приводу в коментарях, а також дайте знати, якщо у вас є пропозиції або побажання щодо тем, які ви б хотіли побачити в наступних статтях.
Дякую та бажаю успіхів у програмуванні!
Перекладено з: SQL CASE Statement: A Quick Guide