Wie schreibe ich eine IF ELSE-Anweisung in eine MySQL-Abfrage?

86

Wie schreibe ich eine IF ELSE-Anweisung in eine MySQL-Abfrage?

Etwas wie das:

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

Dann sollte ich in meinem Array dazu in der Lage sein:

 $row['state'] 
//this should equal 1, the query should not change anything in the database, 
//just the variable for returning the information
Dylan Cross
quelle

Antworten:

150

Sie möchten wahrscheinlich einen CASEAusdruck verwenden .

Sie sehen so aus:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;
Jack Edmonds
quelle
1
Vielen Dank, Ihre Antwort schien einfacher zu folgen (soweit der Fall in der Abfrage enthalten sein soll, konnte ich ihn jedoch nicht ordnungsgemäß ausführen: "SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) THEN 1 ELSE 0 END) AS N.state FROM Benachrichtigungen N, Beiträge P WHERE N.userID = '$ session' UND N.uniqueID = P.id AND P.state = '0' AND N.action = '1' ORDER BY N.date DESC "
Dylan Cross
2
@ DylanCross Sieht aus wie Sie ein Komma zwischen N.idund(CASE WHEN ...
Jack Edmonds
1
Ahh, habe das nicht gesehen, aber selbst wenn ich das Komma setze, funktioniert es nicht.
Dylan Cross
@DylanCross Sie könnten auch ändern müssen AS N.statezu AS state.
Jack Edmonds
8
@DylanCross Verwendet MySQL nicht =statt ==zum Vergleich?
Jack Edmonds
27

Sie müssen es in SQL schreiben, nicht im C / PHP-Stil

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

zur Verwendung in der Abfrage

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

zur Verwendung in gespeicherten Prozeduren oder Funktionen

SergeS
quelle
Ich kann dies nicht mit meinem Code zum Laufen bringen, möglicherweise ist meine Platzierung falsch oder so: SELECT *, N.id IF (N.action = 2 UND N.state = 0, 1, 0) AS N.state FROM Benachrichtigungen N, Beiträge P WHERE N.userID = '$ session' UND N.uniqueID = P.id AND P.state = '0' UND N.action = '1' BESTELLUNG NACH N.date DESC
Dylan Cross
15

Sie suchen case:

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

MySQL hat eine ifSyntax ( if(action=2 and state=0, 1, 0)), caseist aber universeller.

Beachten Sie, dass es as statedort nur ein Aliasing für die Spalte gibt. Ich gehe davon aus, dass dies in der Spaltenliste Ihrer SQL-Abfrage steht.

Eric
quelle
Dies ist eine viel bessere Antwort
bretterer
15
SELECT col1, col2, IF( action = 2 AND state = 0, 1, 0 ) AS state from tbl1;

ODER

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

beide Ergebnisse werden gleich sein ....

Khandad Niazi
quelle
Eine Sache, die mir aufgefallen ist, die ich aber nicht finden konnte, ist, dass der IF der letzte in der Liste der Spalten sein muss. Wenn es das erste ist, gibt es einen Fehler. Weiß jemand, wo dies in der Dokumentation zu sehen ist? Es macht mich verrückt. Wenn ich etwas entdecke, möchte ich es als zukünftige Referenz dokumentiert sehen
carinlynchin
8

Laut dem mySQL-Referenzhandbuch ist dies die Syntax für die Verwendung der if- und else-Anweisung:

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

Also bezüglich Ihrer Anfrage:

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

oder du kannst verwenden

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

Dieser Link enthält ein gutes Beispiel: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
quelle
2
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
MAR