Como escrever a instrução IF ELSE em uma consulta MySQL

86

Como escrevo uma instrução IF ELSE em uma consulta MySQL?

Algo assim:

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

Então, no meu array, devo ser capaz de fazer isso:

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

Respostas:

150

Você provavelmente deseja usar uma CASEexpressão .

Eles se parecem com isto:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;
Jack Edmonds
fonte
1
Obrigado, sua resposta pareceu a mais fácil de seguir, (até onde o caso deveria ir na consulta, no entanto, não consegui fazê-lo funcionar corretamente: "SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) THEN 1 ELSE 0 END) AS N.state FROM notificações 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 está faltando uma vírgula entre N.ide(CASE WHEN ...
Jack Edmonds
1
Ahh, não vi isso, mas mesmo quando coloco a vírgula não funciona.
Dylan Cross
@DylanCross Você também pode precisar mudar AS N.statepara AS state.
Jack Edmonds
8
@DylanCross O MySQL não usa em =vez de ==para comparação?
Jack Edmonds
27

você deve escrever em SQL e não no estilo C / PHP

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

para uso em consulta

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

para uso em procedimentos armazenados ou funções

SergeS
fonte
Não consigo fazer isso funcionar com meu código, talvez meu posicionamento esteja errado ou algo assim: SELECT *, N.id IF (N.action = 2 AND N.state = 0, 1, 0) AS N.state FROM notificações N, postagens P ONDE N.userID = '$ sessão' AND N.uniqueID = P.id AND P.state = '0' AND N.action = '1' ORDEM POR N.date DESC
Dylan Cross
15

Você está procurando por case:

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

MySQL tem uma ifsintaxe ( if(action=2 and state=0, 1, 0)), mascase é mais universal.

Observe que as statehá apenas um alias da coluna. Estou assumindo que isso está na lista de colunas de sua consulta SQL.

Eric
fonte
Esta é uma resposta muito melhor
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;

ambos os resultados serão iguais ....

Khandad Niazi
fonte
uma coisa que notei, mas não consegui encontrar documentação sobre ele, é que o IF deve ser o último na lista de colunas. Se for o primeiro, ocorrerá um erro. Alguém sabe onde ver isso na documentação? Está me deixando louco. Quando descubro algo, gosto de ver documentado para referência futura
carinlynchin
8

de acordo com o manual de referência do mySQL, esta é a sintaxe de usar a instrução if e else:

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

Portanto, em relação à sua consulta:

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

ou você pode usar

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

Há um bom exemplo neste link: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
fonte
2
Um link para uma solução é bem-vindo, mas certifique-se de que sua resposta seja útil sem ele: adicione contexto ao link para que seus outros usuários tenham uma ideia do que ele é e por que está lá, depois cite a parte mais relevante da página que você ' novo link para caso a página de destino não esteja disponível. Respostas que são pouco mais do que um link podem ser excluídas.
MAR