Przypadki w MySQL – CASE WHEN THEN ELSE END

Podobnie jak w PHP, baza danych MySQL ma odpowiednik if, czyli przypadków (inaczej serii warunków, instrukcji warunkowych). Różnicą między implementacją CASE’a w MySQL i ifa PHP jest to, że baza danych zwraca konkretną wartość z case’a, a nie wykonuje dowolnej ilości dowolnych akcji.

CASE Syntax:

Najprostsza struktura CASE’aprzedstawia się nastepująco:

CASE WHEN [conditions] THEN ... ELSE ... END

Składnia powinna rozpocząć się słowem kluczowym CASE, a zakończyć END. Pomiędzy znajdują się warunki WHEN oraz operacja zwrócenia odpowiedniej wartości, która po nich następuje THEN (mamy możliwość uwzględnić nieskończenie wiele warunków). Jeżeli żaden warunek nie zostanie spełniony możemy użyć opcjonalnie ELSE.

Przykłady z życia.

Wyobraźmy sobie, że mamy posortować listę aukcji przedmiotów na Allegro od najtańszych, do najdroższych. Należy założyć, że są 2 typy aukcji: kup teraz i licytacja. Pole licytacji w bazie danych zawiera największą zaproponowaną kwotę przez użytkowników w procesie licytacji, a cena kup teraz ustalana jest przez sprzedającego. Są to dwa różne pola w bazie danych, a jedno kryterium sortowania, dlatego trzeba scalić cenę w jedną, wybierając odpowiednią. Musimy przewidzieć sytuację, w której aukcja jest typu kup teraz oraz licytacji, wówczas jeżeli najwyższa oferta jest większa od ceny kup teraz, wówczas wybieramy pole z największa propozycją:

SELECT (
  CASE
    WHEN (auction_type = 'bidding' OR auction_price_bid > auction_price_buynow)
      THEN auction_price_bid
    ELSE auction_price_buynow
  END) AS auction_price

Stworzyliśmy pole auction_price, po którym można sortować aukcje od najtańszej do najdroższej i na odwrót.

Mam nadzieję, że krótki wpis przyda się początkującym. Nic więcej nie trzeba opisywać, temat wydaje się co najmniej trywialny.

 

4 thoughts on “Przypadki w MySQL – CASE WHEN THEN ELSE END

  1. Na pewno nie switch, a if.

    Poza tym jest to komenda SQL-owa dostępna w każdej jako takiej kompatybilnej bazie: mysql/postgresql/oracle itd.

  2. Zgadza się. Odpowiednikiem IF z PHP jest w MySQL również IF 🙂

    Jeżeli chodzi o CASE to można tej instrukcji w przeciwieństwie do IF korzystać wewnątrz SELECT-a o czym autor w ogóle nie wspomniał.

    SELECT CASE WHEN t.pole1 > 0 THEN 1 ELSE 0 END AS przyklad
    FROM tabela t;

    Analogiczny kod z wykorzystaniem IF:

    IF ((SELECT t.pole FROM tabela t) > 0)
    SELECT 1
    ELSE
    SELECT 0;

  3. Zgadza się. Odpowiednikiem IF z PHP jest w MySQL również IF 🙂

    Jeżeli chodzi o CASE to można tej instrukcji w przeciwieństwie do IF korzystać wewnątrz SELECT-a o czym autor w ogóle nie wspomniał.

    SELECT CASE WHEN t.pole1 > 0 THEN 1 ELSE 0 END AS przyklad
    FROM tabela t;

    Analogiczny kod z wykorzystaniem IF:

    IF ((SELECT t.pole FROM tabela t) > 0)
    SELECT 1
    ELSE
    SELECT 0;

    ANALOGICZNY, ALE NIE DZIAŁA!!!

  4. Będzie odpowiedź po latach, ale co tam 🙂

    Drugi kod nie działa, bo to standard T-SQL, więc zadziała tylko w bazie MS SQL. Microsoft i jego standardy.

Comments are closed.