SQL Academy · Lekcja

Wyrażenie CASE

Logika IF/THEN wewnątrz zapytania

Lekcja 1 z 413 kroki

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łęzi
  • ELSE value — opcjonalna wartość zastępcza
  • END — 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
END

CASE 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 ... END zwraca jedną wartość dla każdego wiersza
  • Gałęzie są sprawdzane od góry do dołu — wygrywa pierwsze dopasowanie
  • Pominięcie ELSE daje wartość NULL, gdy nic nie pasuje
  • Wszystkie gałęzie muszą zwracać zgodne typy
  • CASE działa w SELECT, WHERE oraz 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;
Bezpłatny start

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

  1. Wyrażenie CASE
  2. CASE wyszukiwane a proste
  3. Grupowanie i etykietowanie danych
  4. CASE w ORDER BY i agregacjach
← Powrót do SQL Academy