Η CASE προσθέτει λογική if/then/else σε ένα SQL query: ελέγχει μια λίστα συνθηκών και επιστρέφει το αποτέλεσμα της πρώτης που είναι αληθής. Τα παραδείγματα λειτουργούν σε PostgreSQL, MySQL, SQLite και SQL Server.
Πώς χρησιμοποιείς τη CASE
Γράψε ζεύγη WHEN condition THEN result ανάμεσα στο CASE και στο END. Η CASE επιστρέφει το αποτέλεσμα της πρώτης αληθούς συνθήκης ή την τιμή του ELSE αν καμία δεν ισχύει:
CASE
WHEN condition THEN result
[WHEN condition THEN result ...]
[ELSE result]
END
SELECT
CASE
WHEN 72 >= 90 THEN 'Hot'
WHEN 72 >= 60 THEN 'Mild'
ELSE 'Cold'
END;
-- Output: Mild
Όταν κάθε συνθήκη ελέγχει ισότητα με την ίδια τιμή, η πιο σύντομη «απλή» μορφή αναφέρει αυτή την τιμή μόνο μία φορά:
SELECT
CASE 'amber'
WHEN 'green' THEN 'Go'
WHEN 'amber' THEN 'Slow down'
WHEN 'red' THEN 'Stop'
ELSE 'Unknown'
END;
-- Output: Slow down
Σε ένα πραγματικό query οι συνθήκες ελέγχουν στήλες και η CASE προσθέτει μια νέα στήλη στο αποτέλεσμα:
-- Input: orders
-- order_id | amount
-- ---------+--------
-- 1001 | 45.00
-- 1002 | 100.00
-- 1003 | 349.99
-- 1004 | 1250.00
SELECT
order_id,
amount,
CASE
WHEN amount < 100 THEN 'Small'
WHEN amount < 500 THEN 'Medium'
ELSE 'Large'
END AS order_size
FROM orders;
-- Output:
-- order_id | amount | order_size
-- ---------+---------+-----------
-- 1001 | 45.00 | Small
-- 1002 | 100.00 | Medium
-- 1003 | 349.99 | Medium
-- 1004 | 1250.00 | Large
Κανόνες που πρέπει να ξέρεις
-
Κερδίζει η πρώτη αληθής συνθήκη. Οι συνθήκες ελέγχονται από πάνω προς τα κάτω, οπότε βάλε πρώτα την πιο στενή. Παραπάνω, το
100.00είναι Medium επειδή τοamount < 100είναι ψευδές και τοamount < 500αληθές. Με λάθος σειρά, τα μικρά ποσά δεν φτάνουν ποτέ στον κλάδο τους:
SELECT
CASE
WHEN 45 < 500 THEN 'Medium'
WHEN 45 < 100 THEN 'Small' -- can never win
ELSE 'Large'
END;
-- Output: Medium
- Χωρίς ELSE, αν δεν ταιριάξει τίποτα, παίρνεις NULL.
SELECT CASE WHEN 72 >= 90 THEN 'Hot' END;
-- Output: NULL
-
Έλεγξε για NULL με IS NULL. Το
NULL = NULLδεν είναι αληθές, οπότε η απλή μορφή δεν μπορεί να ταιριάξει ένα NULL. Χρησιμοποίησε τη μορφή με συνθήκες:
SELECT CASE NULL WHEN NULL THEN 'matched' ELSE 'no match' END;
-- Output: no match
SELECT CASE WHEN NULL IS NULL THEN 'matched' ELSE 'no match' END;
-- Output: matched
- Κάθε αποτέλεσμα χρειάζεται συμβατό τύπο. Αν ανακατέψεις αριθμό και κείμενο σε μία CASE, αποτυγχάνει σε PostgreSQL και SQL Server, οπότε κάνε cast τον αριθμό:
-- Input: products
-- name | stock
-- -------------+------
-- Desk Lamp | 12
-- Office Chair | 0
SELECT name, CASE WHEN stock > 0 THEN stock ELSE 'Sold out' END AS stock
FROM products;
-- PostgreSQL: ERROR: invalid input syntax for type integer: "Sold out"
-- SQL Server: Conversion failed when converting the varchar value 'Sold out' to data type int.
-- (in MySQL, cast with CAST(stock AS CHAR))
SELECT
name,
CASE WHEN stock > 0 THEN CAST(stock AS VARCHAR(10)) ELSE 'Sold out' END AS stock
FROM products;
-- Output:
-- name | stock
-- -------------+---------
-- Desk Lamp | 12
-- Office Chair | Sold out
Εναλλακτική σύνταξη
Για μία μόνο συνθήκη θα δεις και μια πιο σύντομη συνάρτηση:
-- MySQL
SELECT IF(72 >= 60, 'Mild', 'Cold');
-- Output: Mild
-- SQL Server and SQLite
SELECT IIF(72 >= 60, 'Mild', 'Cold');
-- Output: Mild
Δύο ακόμη συναρτήσεις είναι συντομεύσεις για συνηθισμένες εκφράσεις CASE. Το COALESCE(nickname, name) σημαίνει CASE WHEN nickname IS NOT NULL THEN nickname ELSE name END και το NULLIF(a, b) σημαίνει CASE WHEN a = b THEN NULL ELSE a END. Για την πρώτη, δες τον οδηγό για τη SQL COALESCE.
Η MySQL έχει επίσης μια εντολή CASE για stored procedures, που τελειώνει με END CASE. Αυτό το άρθρο καλύπτει την έκφραση CASE που χρησιμοποιείς σε queries.
Πότε να χρησιμοποιείς τη CASE;
Η CASE είναι έκφραση, οπότε λειτουργεί οπουδήποτε μπαίνει μια τιμή: στη λίστα του SELECT, στα ORDER BY και GROUP BY και μέσα σε συναρτήσεις συνάθροισης. Λειτουργεί και στο WHERE, αλλά εκεί τα απλά AND και OR είναι συνήθως πιο καθαρά. Οι περισσότερες χρήσεις ανήκουν σε μία από τις παρακάτω πέντε.
Χώρισε αριθμούς σε εύρη
Μετάτρεψε έναν αριθμό σε κατηγορία: κλίμακες τιμών, μεγέθη παραγγελιών, ηλικιακές ομάδες, βαθμούς. Γράψε τις συνθήκες από τη μία άκρη της κλίμακας ως την άλλη, ώστε το πρώτο ταίριασμα να είναι το σωστό.
Μετάφρασε κωδικούς σε ετικέτες
Οι βάσεις δεδομένων αποθηκεύουν σύντομους κωδικούς όπως 'A', 'ENG' ή 'gold'· οι άνθρωποι θέλουν λέξεις. Μια απλή CASE αντιστοιχίζει κάθε κωδικό σε μια ετικέτα ή σε μια τιμή, όπως ένα ποσοστό έκπτωσης, και το ELSE πιάνει όποιον κωδικό δεν περίμενες.
Μέτρησε ή άθροισε μόνο κάποιες γραμμές
Βάλε τη CASE μέσα σε COUNT ή SUM για να μετρήσεις ή να αθροίσεις μόνο τις γραμμές που πληρούν μια συνθήκη. Το COUNT(CASE WHEN ... THEN 1 END) λειτουργεί επειδή οι γραμμές που δεν ταιριάζουν δίνουν NULL, που το COUNT παραλείπει. Μία συνάρτηση συνάθροισης ανά συνθήκη σού δίνει πολλά σύνολα δίπλα-δίπλα, και έτσι φτιάχνεις έναν pivot πίνακα σε SQL.
Χειρίσου τις τιμές που λείπουν
Έλεγξε στήλες για NULL με σειρά προτίμησης και επέστρεψε μια ετικέτα όταν είναι όλες κενές. Για μια απλή εναλλακτική τιμή, το COALESCE είναι πιο σύντομο. Η CASE είναι το εργαλείο όταν κάθε είδος κενού χρειάζεται διαφορετικό αποτέλεσμα.
Ταξινόμησε με δική σου σειρά
Η αλφαβητική και η αριθμητική σειρά δεν ταιριάζουν σε όλα: μεγέθη ρούχων, προτεραιότητες tickets, μια λίστα με τα προβεβλημένα προϊόντα πρώτα. Μια CASE στο ORDER BY δίνει σε κάθε τιμή τη θέση που θέλεις.
Πραγματικά παραδείγματα CASE
Κατάταξε προϊόντα ανά τμήμα και τιμή
Ένα αποτέλεσμα μπορεί να είναι και το ίδιο μια CASE, οπότε κάθε τμήμα παίρνει τις δικές του κλίμακες τιμών:
-- Input: products
-- product_name | category | price
-- -----------------+-------------+--------
-- Laptop Pro 14 | Electronics | 1499.00
-- Wireless Earbuds | Electronics | 129.00
-- Leather Jacket | Clothing | 349.00
-- Cotton T-Shirt | Clothing | 19.99
-- Coffee Mug | Kitchen | 12.50
SELECT
product_name,
CASE category
WHEN 'Electronics' THEN
CASE
WHEN price > 1000 THEN 'Premium Electronics'
ELSE 'Standard Electronics'
END
WHEN 'Clothing' THEN
CASE
WHEN price > 200 THEN 'Designer Clothing'
ELSE 'Regular Clothing'
END
ELSE 'Other Products'
END AS product_class
FROM products;
-- Output:
-- product_name | product_class
-- -----------------+---------------------
-- Laptop Pro 14 | Premium Electronics
-- Wireless Earbuds | Standard Electronics
-- Leather Jacket | Designer Clothing
-- Cotton T-Shirt | Regular Clothing
-- Coffee Mug | Other Products
Πέρα από δύο επίπεδα, η εμφωλευμένη CASE γίνεται δυσανάγνωστη. Ένας πίνακας αναφοράς με join είναι συνήθως πιο καθαρός.
Εφάρμοσε έκπτωση ανά κατηγορία πελάτη
Κάθε κωδικός κατηγορίας αντιστοιχεί σε ένα ποσοστό έκπτωσης, και οι πελάτες χωρίς κατηγορία δεν παίρνουν έκπτωση:
-- Input: customers
-- id | customer_name | tier
-- ---+---------------+-------
-- 1 | Maya Brooks | gold
-- 2 | Leo Martin | silver
-- 3 | Ava Kim | bronze
-- 4 | Noah Price | NULL
-- Input: orders
-- id | customer_id | order_total
-- ----+-------------+------------
-- 101 | 1 | 200.00
-- 102 | 2 | 150.00
-- 103 | 3 | 80.00
-- 104 | 4 | 60.00
SELECT
customer_name,
order_total,
ROUND(order_total * CASE tier
WHEN 'gold' THEN 0.15
WHEN 'silver' THEN 0.10
WHEN 'bronze' THEN 0.05
ELSE 0
END, 2) AS discount
FROM customers c
JOIN orders o ON c.id = o.customer_id
ORDER BY o.id;
-- Output:
-- customer_name | order_total | discount
-- --------------+-------------+---------
-- Maya Brooks | 200.00 | 30.00
-- Leo Martin | 150.00 | 15.00
-- Ava Kim | 80.00 | 4.00
-- Noah Price | 60.00 | 0.00
Κάνε pivot τις μηνιαίες πωλήσεις σε στήλες
Ένα SUM(CASE ...) ανά μήνα μετατρέπει τις γραμμές πωλήσεων σε μία στήλη για κάθε μήνα:
-- Input: sales
-- product_category | sale_date | amount
-- -----------------+------------+-------
-- Books | 2026-01-12 | 40.00
-- Games | 2026-01-20 | 60.00
-- Books | 2026-02-03 | 25.00
-- Books | 2026-03-15 | 30.00
-- Games | 2026-03-28 | 75.00
SELECT
product_category,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1 THEN amount ELSE 0 END) AS jan_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2 THEN amount ELSE 0 END) AS feb_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3 THEN amount ELSE 0 END) AS mar_sales
FROM sales
GROUP BY product_category
ORDER BY product_category;
-- Output:
-- product_category | jan_sales | feb_sales | mar_sales
-- -----------------+-----------+-----------+----------
-- Books | 40.00 | 25.00 | 30.00
-- Games | 60.00 | 0 | 75.00
Στον SQL Server, χρησιμοποίησε MONTH(sale_date) = 1 αντί για EXTRACT· στη SQLite, χρησιμοποίησε strftime('%m', sale_date) = '01'.
Ξεχώρισε τις τιμές που λείπουν από τις κενές
Τα εισαγόμενα δεδομένα έχουν συχνά και NULL και κενά strings. Η CASE μπορεί να επισημάνει το καθένα, ώστε να ξέρεις τι να καθαρίσεις:
-- Input: users
-- id | middle_name
-- ---+------------
-- 1 | Rose
-- 2 |
-- 3 | NULL
SELECT
id,
CASE
WHEN middle_name IS NULL THEN 'Missing'
WHEN middle_name = '' THEN 'Empty'
ELSE middle_name
END AS middle_name
FROM users;
-- Output:
-- id | middle_name
-- ---+------------
-- 1 | Rose
-- 2 | Empty
-- 3 | Missing
Βάλε πρώτα τα προβεβλημένα προϊόντα
Δώσε σε κάθε κατηγορία μια θέση ταξινόμησης και μετά ταξινόμησε κατά όνομα μέσα σε αυτήν:
-- Input: products
-- product_name | category
-- -------------+------------
-- Wool Scarf | Sale
-- Desk Lamp | Featured
-- Bike Helmet | Clearance
-- Smart Watch | New Arrival
-- Air Fryer | Featured
SELECT product_name, category
FROM products
ORDER BY
CASE category
WHEN 'Featured' THEN 1
WHEN 'New Arrival' THEN 2
WHEN 'Sale' THEN 3
ELSE 4
END,
product_name;
-- Output:
-- product_name | category
-- -------------+------------
-- Air Fryer | Featured
-- Desk Lamp | Featured
-- Smart Watch | New Arrival
-- Wool Scarf | Sale
-- Bike Helmet | Clearance
Περισσότερα για τη CASE
Σε αυτό το blog:
- Οδηγός για τη SQL COALESCE: ο σύντομος τρόπος για εναλλακτική τιμή όταν μια τιμή είναι NULL
- Οδηγός για pivot πίνακες στη SQL: CASE μέσα σε SUM και AVG για να γίνουν οι γραμμές στήλες
- Οδηγός για το SQL ORDER BY: ταξινόμηση, και με δική σου σειρά
- Οδηγός για το SQL GROUP BY: η ομαδοποίηση πάνω στην οποία στηρίζονται οι υπό συνθήκη μετρήσεις και τα σύνολα
- Οδηγός για το «όχι ίσο» στη SQL: γιατί οι συγκρίσεις με NULL δεν ταιριάζουν ποτέ
Επίσημη τεκμηρίωση:
Το Beekeeper Studio είναι ένα δωρεάν & open source GUI για βάσεις δεδομένων
Το καλύτερο εργαλείο για SQL queries & επεξεργασία που έχω χρησιμοποιήσει ποτέ. Μου δίνει ό,τι χρειάζομαι για να διαχειρίζομαι τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit
Το Beekeeper Studio είναι γρήγορο, εύχρηστο και κατανοητό με την πρώτη ματιά. Υποστηρίζει πάρα πολλές βάσεις δεδομένων και δουλεύει άψογα σε Windows, Mac και Linux.
Τι λένε οι χρήστες για το Beekeeper Studio
«Το Beekeeper Studio αντικατέστησε εντελώς την παλιά μου ροή εργασίας με SQL. Είναι γρήγορο, εύχρηστο και κάνει τη δουλειά με βάσεις δεδομένων ξανά ευχάριστη.»
«Έχω δοκιμάσει πολλά GUI για βάσεις δεδομένων, αλλά το Beekeeper βρίσκει την τέλεια ισορροπία ανάμεσα σε δυνατότητες και απλότητα. Απλώς δουλεύει.»