2010-08-02 10 views
56

wiem, że CASE składni SQL jest następujący:Jak działa CASE MySQL?

CASE 
    WHEN search_condition THEN statement_list 
    [WHEN search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

Ja jednak nie rozumiem, jak to działa, prawdopodobnie dlatego, że myślę o nim jako o rachunku if.

Jeśli mam na przykład pole w tabeli user_role, które zawiera nazwy takie jak "Menedżer", "Czas w Partii" itp., W jaki sposób wygenerować pole role_order z inną liczbą w zależności od roli. W przypadku tego przykładu "jeśli user_role =" Manager "to role_order = 5".

Uwaga ja szukam uczyć człowieka jak łowić odpowiedź zamiast dać człowiekowi rybę odpowiedź.

Odpowiedz

101

CASE jest bardziej jak instrukcja switch. Ma dwie składnie, których możesz użyć. Pierwszy pozwala na użycie dowolnego porównać oświadczenia chcesz:

CASE 
    WHEN user_role = 'Manager' then 4 
    WHEN user_name = 'Tom' then 27 
    WHEN columnA <> columnB then 99 
    ELSE -1 --unknown 
END 

Drugi styl to do kiedy badają tylko jedną wartość, i jest nieco bardziej zwięzła:

CASE user_role 
    WHEN 'Manager' then 4 
    WHEN 'Part Time' then 7 
    ELSE -1 --unknown 
END 
+1

co mówisz ma sens, jestem nadal mylić o tym, gdzie to idzie wewnątrz reszty zapytania próbowałem 'select *, Twój kod AS role_order FROM table' Ale ciągle dostaję błędy. Czy możesz pokazać przykład używając całego zapytania? Dziękuję Ci! –

+7

Rozgryzłem to, Powinieneś zakończyć z "END", a nie "END CASE" http://dev.mysql.com/doc/refman/5.0/en/case-statement.html Dziękujemy! –

+0

Dla tych, którzy nie czytali dokumentów połączonych powyżej, możesz nie przeczytać tego komentarza, ale na wszelki wypadek: Zauważ, że istnieją dwie różne formy "CASE", z bardzo podobną składnią, ale nieco innym celem/użyciem. .. Zobacz też [to pytanie] (http://stackoverflow.com/q/12436859/2359271). – Air

12

CASE w MySQL jest zarówno a statement i expression, gdzie każde użycie jest nieco inne.

jako oświadczenie, CASE pracuje podobnie jak switch i jest przydatna w procedur przechowywanych, jak pokazano w tym przykładzie z dokumentacji (powiązany powyżej):

DELIMITER | 

CREATE PROCEDURE p() 
    BEGIN 
    DECLARE v INT DEFAULT 1; 

    CASE v 
     WHEN 2 THEN SELECT v; 
     WHEN 3 THEN SELECT 0; 
     ELSE 
     BEGIN -- Do other stuff 
     END; 
    END CASE; 
    END; 
    | 

jednak jako wyraz może być stosowane w punktach:

SELECT * 
    FROM employees 
    ORDER BY 
    CASE title 
     WHEN "President" THEN 1 
     WHEN "Manager" THEN 2 
     ELSE 3 
    END, surname 

Dodatkowo, zarówno jako oświadczenie i jako wyraz, pierwszy argument może zostać pominięty i każdy WHEN musi podjąć warunek.

SELECT * 
    FROM employees 
    ORDER BY 
    CASE 
     WHEN title = "President" THEN 1 
     WHEN title = "Manager" THEN 2 
     ELSE 3 
    END, surname 

I, pod warunkiem tę odpowiedź, ponieważ inna odpowiedź nie wspomnieć, że CASE może funkcjonować zarówno jako oświadczenie i jako wyraz. Główna różnica między nimi polega na tym, że formularz oświadczenia kończy się END CASE, a formularz wyrażenia kończy się właśnie END.

0

Chciałem prostego przykładu użycia walizki, w którą mogłem się bawić, to nawet nie potrzebuje stołu. To zwraca dziwne lub nawet w zależności od tego, czy sekunda jest parzysty, czy nieparzysty

SELECT CASE MOD(SECOND(NOW()),2) WHEN 0 THEN 'odd' WHEN 1 THEN 'even' END;