Jak napisać instrukcję IF ELSE w zapytaniu MySQL

86

Jak napisać instrukcję IF ELSE w zapytaniu MySQL?

Coś takiego:

mysql_query("...(irrelevant code).. IF(action==2&&state==0){state=1}");

Następnie w mojej tablicy powinienem być w stanie zrobić to:

 $row['state'] 
//this should equal 1, the query should not change anything in the database, 
//just the variable for returning the information
Dylan Cross
źródło

Odpowiedzi:

150

Prawdopodobnie chcesz użyć CASEwyrażenia .

Wyglądają tak:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;
Jack Edmonds
źródło
1
Dzięki, twoja odpowiedź wydawała się łatwiejsza do naśladowania (jeśli chodzi o miejsce, w którym przypadek powinien znaleźć się w zapytaniu, jednak nie udało mi się sprawić, aby działał poprawnie: "SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) THEN 1 ELSE 0 END) AS N.state Z powiadomień N, posty P WHERE N.userID = '$ session' AND N.uniqueID = P.id AND P.state = '0' AND N. action = '1' ZAMÓWIENIE PRZEZ N.date DESC "
Dylan Cross
2
@DylanCross Wygląda na to może brakować przecinek pomiędzy N.idi(CASE WHEN ...
Jack Edmonds
1
Ahh, nie widziałem tego, ale nawet kiedy wstawię przecinek, to nie działa.
Dylan Cross
@DylanCross Konieczne może być również przejście AS N.statena AS state.
Jack Edmonds
8
@DylanCross Czy MySQL nie używa =zamiast ==porównania?
Jack Edmonds
28

musisz napisać to w SQL, a nie w stylu C / PHP

IF( action = 2 AND state = 0, 1, 0 ) AS state

do użycia w zapytaniu

IF ( action = 2 AND state = 0 ) THEN SET state = 1

do użytku w procedurach składowanych lub funkcjach

SergeS
źródło
Nie mogę zmusić tego do działania z moim kodem, być może moje miejsce docelowe jest nieprawidłowe lub coś: SELECT *, N.id IF (N.action = 2 AND N.state = 0, 1, 0) AS N.state FROM powiadomienia N, posty P WHERE N.userID = '$ session' AND N.uniqueID = P.id AND P.state = '0' AND N.action = '1' ORDER BY N.date DESC
Dylan Cross
15

Szukasz case:

case when action = 2 and state = 0 then 1 else 0 end as state

MySQL ma ifskładnię ( if(action=2 and state=0, 1, 0)), ale casejest bardziej uniwersalny.

Zwróć uwagę, że as statewystępuje tylko aliasowanie kolumny. Zakładam, że znajduje się to na liście kolumn twojego zapytania SQL.

Eric
źródło
To znacznie lepsza odpowiedź
bretterer
15
SELECT col1, col2, IF( action = 2 AND state = 0, 1, 0 ) AS state from tbl1;

LUB

SELECT col1, col2, (case when (action = 2 and state = 0) then 1 else 0 end) as state from tbl1;

oba wyniki będą takie same ....

Khandad Niazi
źródło
jedną rzeczą, którą zauważyłem, ale nie mogłem znaleźć na jej temat dokumentacji, jest to, że IF musi być ostatnim na liście kolumn. Jeśli jest pierwszy, powoduje błąd. Czy ktoś wie, gdzie to zobaczyć w dokumentacji? Doprowadza mnie to do szału. Kiedy coś odkrywam, chciałbym zobaczyć to udokumentowane na przyszłość
carinlynchin
8

zgodnie z podręcznikiem użytkownika mySQL jest to składnia użycia instrukcji if i else:

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

Więc jeśli chodzi o twoje zapytanie:

x = IF((action=2)&&(state=0),1,2);

lub możesz użyć

IF ((action=2)&&(state=0)) then 
state = 1;
ELSE 
state = 2;
END IF;

W tym linku jest dobry przykład: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
źródło
2
Link do rozwiązania jest mile widziany, ale upewnij się, że Twoja odpowiedź jest przydatna bez niego: dodaj kontekst wokół linku, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje, a następnie zacytuj najbardziej odpowiednią część strony, którą znasz. ponowne łącze w przypadku, gdy strona docelowa jest niedostępna. Odpowiedzi, które są niewiele więcej niż linkiem, mogą zostać usunięte.
MAR