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

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;

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


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.


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 ....


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/


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.