Comment écrire une instruction IF ELSE dans une requête MySQL

86

Comment écrire une instruction IF ELSE dans une requête MySQL?

Quelque chose comme ça:

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

Ensuite, dans mon tableau, je devrais pouvoir le faire:

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

Réponses:

150

Vous souhaitez probablement utiliser une CASEexpression .

Ils ressemblent à ceci:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;
Jack Edmonds
la source
1
Merci, votre réponse a semblé la plus facile à suivre, (pour autant que le cas soit supposé aller dans la requête, cependant je n'ai pas pu le faire fonctionner correctement: "SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) THEN 1 ELSE 0 END) AS N.state FROM notifications N, posts 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
2
@DylanCross On dirait qu'il vous manque peut-être une virgule entre N.idet(CASE WHEN ...
Jack Edmonds
1
Ahh, je n'ai pas vu ça, mais même quand je mets la virgule ça ne marche pas.
Dylan Cross le
@DylanCross Vous devrez peut-être également changer AS N.statepour AS state.
Jack Edmonds
8
@DylanCross MySQL n'utilise-t-il pas =plutôt que ==pour comparaison?
Jack Edmonds
28

vous devez l'écrire en SQL pas en style C / PHP

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

à utiliser dans la requête

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

pour une utilisation dans des procédures ou des fonctions stockées

SergeS
la source
Je ne parviens pas à faire fonctionner cela avec mon code, peut-être que mon emplacement est incorrect, ou quelque chose: SELECT *, N.id IF (N.action = 2 AND N.state = 0, 1, 0) AS N.state FROM notifications N, posts 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

Vous recherchez case:

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

MySQL a une ifsyntaxe ( if(action=2 and state=0, 1, 0)), mais caseest plus universelle.

Notez qu'il as staten'y a que l'alias de la colonne. Je suppose que c'est dans la liste des colonnes de votre requête SQL.

Eric
la source
C'est une bien meilleure réponse
bretterer
15
SELECT col1, col2, IF( action = 2 AND state = 0, 1, 0 ) AS state from tbl1;

OU

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

les deux résultats seront identiques ...

Khandad Niazi
la source
une chose que j'ai remarquée mais je n'ai pas trouvé de documentation à ce sujet est que le IF doit être le dernier dans la liste des colonnes. Si c'est le premier, cela donne une erreur. Quelqu'un sait où voir cela dans la documentation? Ça me rend fou. Quand je découvre quelque chose, j'aime le voir documenté pour référence future
carinlynchin
8

selon le manuel de référence mySQL, voici la syntaxe d'utilisation de l'instruction if et else:

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

Donc en ce qui concerne votre requête:

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

ou vous pouvez utiliser

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

Il y a un bon exemple dans ce lien: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
la source
2
Un lien vers une solution est le bienvenu, mais veuillez vous assurer que votre réponse est utile sans elle: ajoutez du contexte autour du lien afin que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là, puis citez la partie la plus pertinente de la page que vous '' relier au cas où la page cible ne serait pas disponible. Les réponses qui ne sont guère plus qu'un lien peuvent être supprimées.
MAR