Wyrażenie CASE
Logika IF/THEN wewnątrz zapytania
Wyrażenie CASE to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Logika warunkowa w SQL
Czasami zapytanie musi podjąć decyzję: jeśli to, to tamto, w przeciwnym razie coś innego. SQL udostępnia do tego dokładnie wyrażenie CASE.
CASE pozwala zwracać różne wartości na podstawie warunków, bezpośrednio wewnątrz SELECT. Można traktować je jako odpowiednik łańcucha if/else w SQL.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Budowa CASE
Wyrażenie CASE składa się z kilku elementów:
WHEN condition THEN value— jedna lub więcej gałęziELSE value— opcjonalna wartość zastępczaEND— zamyka wyrażenie (wymagane!)
SQL ocenia gałęzie WHEN od góry do dołu i zwraca wartość pierwszej gałęzi, dla której warunek jest prawdziwy.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE zwraca wartość
Najważniejsza idea jest taka: wyrażenie CASE oblicza pojedynczą wartość dla każdego wiersza. Ponieważ zwraca wartość, można go użyć wszędzie tam, gdzie dozwolona jest wartość — na liście SELECT, w WHERE, w ORDER BY, a nawet wewnątrz funkcji.
W tym przykładzie każde zamówienie otrzymuje prosty status.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;Wygrywa pierwsze dopasowanie
Kolejność ma znaczenie. SQL sprawdza kolejne wyrażenia WHEN i zatrzymuje się przy pierwszym prawdziwym. Późniejsze gałęzie są ignorowane, nawet jeśli również pasowałyby do danych.
Poniżej zamówienie o wartości ponad 1000 jest 'large', a nigdy 'medium', ponieważ wygrywa pierwsza pasująca gałąź.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;Gałąź ELSE
Gałąź ELSE obejmuje wszystkie pozostałe przypadki. Jeśli żaden z warunków WHEN nie jest prawdziwy, CASE zwraca wartość ELSE.
Jeśli pominięto ELSE i nic nie pasuje, CASE zwraca NULL. To częste źródło nieoczekiwanych wartości NULL, dlatego należy dodać jawną gałąź ELSE, gdy potrzebna jest określona wartość zastępcza.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Warunki mogą być dowolne
Warunek WHEN to po prostu wyrażenie logiczne — taki sam rodzaj wyrażenia, jaki zapisuje się w klauzuli WHERE. Można używać porównań, AND, OR, BETWEEN, IN, LIKE i wielu innych elementów.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Typy wyników muszą być zgodne
Każda gałąź wyrażenia CASE musi zwracać wartości zgodnego typu, ponieważ kolumna musi mieć jeden typ. Mieszanie tekstu i liczb spowoduje błąd albo nieoczekiwane rzutowanie.
Jeśli w jednej gałęzi potrzebne są liczby, a w innej tekst, należy jawnie wykonać rzutowanie, aby typy były zgodne.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Używanie CASE w WHERE
Ponieważ CASE zwraca wartość, można porównać jego wynik wewnątrz klauzuli WHERE. Przydaje się to w przypadku dynamicznych reguł filtrowania.
Często jednak zwykła logika boolowska w WHERE jest czytelniejsza — po CASE w WHERE należy sięgać tylko wtedy, gdy rozgałęzienie rzeczywiście upraszcza warunek.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Zagnieżdżanie CASE
Można umieścić wyrażenie CASE wewnątrz innej gałęzi CASE, aby wyrazić wielopoziomową logikę. To działa, ale głęboko zagnieżdżone wyrażenia stają się trudne do odczytania.
Należy unikać głębokiego zagnieżdżania; jeśli wyrażenie się rozrasta, zwykle czytelniejsza będzie osobna kolumna albo tabela wyszukiwania.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE z funkcjami agregującymi
Przydatny wzorzec polega na umieszczeniu CASE wewnątrz funkcji agregującej, takiej jak SUM lub COUNT. Pozwala to warunkowo zliczać lub sumować wiersze w jednym przebiegu — ten sposób bywa nazywany agregacją warunkową lub operacją pivot.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;Celowe zwracanie NULL przez CASE
Zwracanie wartości NULL z gałęzi jest czasem dokładnie tym, czego Państwo potrzebują — na przykład aby ukryć wartość, której nie chcą Państwo wyświetlać, albo przekazać ją do późniejszej funkcji agregującej, która pomija wartości NULL.
W tym przypadku tylko duże zamówienia zachowują swoją sumę; pozostałe otrzymują wartość NULL, więc funkcja AVG je pominie.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Szybki test
Rozważmy następujące wyrażenie dla wiersza, w którym total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Jaką wartość zwraca?
Podsumowanie: wyrażenie CASE
Poznali Państwo podstawy logiki warunkowej w SQL:
CASE WHEN ... THEN ... ELSE ... ENDzwraca jedną wartość dla każdego wiersza- Gałęzie są sprawdzane od góry do dołu — wygrywa pierwsze dopasowanie
- Pominięcie
ELSEdaje wartośćNULL, gdy nic nie pasuje - Wszystkie gałęzie muszą zwracać zgodne typy
CASEdziała wSELECT,WHEREoraz wewnątrz funkcji agregujących
Następnie porównamy dwie formy składni wyrażenia CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Ucz się SQL dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 46
- Lekcje
- 183
Często zadawane pytania
Czy lekcja „Wyrażenie CASE” jest bezpłatna?
Tak — pełny tekst „Wyrażenie CASE” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyrażenie CASE”?
Logika IF/THEN wewnątrz zapytania Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Wyrażenie CASE”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wyrażenie CASE
- CASE wyszukiwane a proste
- Grupowanie i etykietowanie danych
- CASE w ORDER BY i agregacjach