¿Cómo escribir la declaración IF ELSE en una consulta MySQL?

86

¿Cómo escribo una declaración IF ELSE en una consulta MySQL?

Algo como esto:

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

Luego, en mi matriz, debería poder hacer esto:

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

Respuestas:

150

Probablemente quieras usar una CASEexpresión .

Se ven así:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;
Jack Edmonds
fuente
1
Gracias, su respuesta parecía más fácil de seguir (en la medida en que se supone que debe ir el caso en la consulta, sin embargo, no he podido hacer que funcione correctamente: "SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) LUEGO 1 ELSE 0 END) AS N.state FROM notificaciones 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 Parece que le falta una coma entre N.idy(CASE WHEN ...
Jack Edmonds
1
Ahh, no vi eso, pero incluso cuando puse la coma no funciona.
Dylan Cross
@DylanCross Es posible que también deba cambiar AS N.statea AS state.
Jack Edmonds
8
@DylanCross ¿No se usa MySQL en =lugar de ==para comparar?
Jack Edmonds
28

debes escribirlo en SQL, no en estilo C / PHP

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

para usar en consultas

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

para su uso en funciones o procedimientos almacenados

SergeS
fuente
No puedo hacer que esto funcione con mi código, tal vez mi ubicación sea incorrecta o algo así: SELECT *, N.id IF (N.action = 2 AND N.state = 0, 1, 0) AS N.state FROM notificaciones N, publicaciones 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

Estas buscando case:

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

MySQL tiene una ifsintaxis ( if(action=2 and state=0, 1, 0)), pero casees más universal.

Tenga en cuenta que as statesolo hay un alias en la columna. Supongo que esto está en la lista de columnas de su consulta SQL.

Eric
fuente
Esta es una respuesta mucho mejor
bretterer
15
SELECT col1, col2, IF( action = 2 AND state = 0, 1, 0 ) AS state from tbl1;

O

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

ambos resultados serán iguales ...

Khandad Niazi
fuente
Una cosa que noté pero que no pude encontrar documentación al respecto es que el SI tiene que ser el último en la lista de columnas. Si es el primero, da un error. ¿Alguien sabe dónde ver esto en la documentación? Me esta volviendo loco. Cuando descubro algo, me gusta verlo documentado para futuras referencias
carinlynchin
8

de acuerdo con el manual de referencia de mySQL, esta es la sintaxis de usar la declaración if y else:

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

Entonces, con respecto a su consulta:

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

o puedes usar

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

Hay un buen ejemplo en este enlace: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
fuente
2
Un enlace a una solución es bienvenido, pero asegúrese de que su respuesta sea útil sin él: agregue contexto alrededor del enlace para que sus compañeros usuarios tengan una idea de qué es y por qué está allí, luego cite la parte más relevante de la página. está enlazando a en caso de que la página de destino no esté disponible. Las respuestas que son poco más que un enlace pueden eliminarse.
MAR