CASE valor WHEN [valor comparado] THEN resultado
[WHEN [valor comparado] THEN resultado ...] [ELSE
resultado] END
, CASE WHEN [condição]
THEN result [WHEN [condição] THEN resultado ...] [ELSE
resultado] END
A primeira expressão retorna o
resultado
onde valor=valor
comparado
. A segunda expressão retorna o o
resultado da primeira condição, a qual é verdadeira. Se
não existe nenhum resultado correspondente, então o
resultado depois do ELSE
é retornado.
Se não existe parte ELSE
então é
retornado NULL
is returned:
mysql>SELECT CASE 1 WHEN 1 THEN "um"
WHEN 2 THEN "dois" ELSE "mais" END; -> "one" mysql>SELECT CASE WHEN 1>0 THEN "verdadeiro" ELSE "falso" END;
-> "true" mysql>SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
O tipo do valor de retorno (INTEGER
,
DOUBLE
ou STRING
) é
do mesmo tipo do primeiro valor retornado (a expressão
depois do primeiro THEN
).
IF(expr1,expr2,expr3)
Se expr1
é VERDADEIRA (expr1
<> 0
e expr1 <>
NULL
) então IF()
retorna
expr2
, senão ela retorna
expr3
. IF()
returna
um valor numérico ou string, dependendo do contexto no
qual é usado.
mysql>SELECT IF(1>2,2,3);
-> 3 mysql>SELECT IF(1<2,'sim','não');
-> 'sim' mysql>SELECT IF(STRCMP('teste','teste1'),'não','sim');
-> 'não'
Se expr2
ou expr3
é
explicitamente NULL
então o tipo
resultante da função IF()
é o tipo
da coluna não NULL
. (Este
comportamento é novo na versão 4.0.3 do MySQL).
expr1
é avaliada como um valor
inteiro, o qual significa que se você está testando
valores de ponto flutuante ou strings, você de fazê-lo
usando um operando de comparação:
mysql>SELECT IF(0.1,1,0);
-> 0 mysql>SELECT IF(0.1<>0,1,0);
-> 1
No primeiro caso acima, IF(0.1)
retorna
0
porque 0.1
é
convertido para um valor inteiro, resultando um um teste
IF(0)
. Isto pode não ser o que você
esperava. No segundo caso, a comparação testa se o valor
de ponto flutuante não é zero. O resultado da
comparação converte o termo em um interiro.
O tipo de retorno padrão de IF()
(o
que pode importar quando ele é armazenado em uma tabela
temporária) é calculado na versão 3.23 do MySQL de
seguinte forma:
Expressão | Valor de retorno |
expr2 ou expr3 retorna string | string |
expr2 ou expr3 retorna um valor de ponto flutuante | ponto flutuante |
expr2 ou expr3 retorna um inteiro | inteiro |
Se expr2 e expr3 são strings, então o resultado é caso-insensitivo se ambas strings são caso insensitivo. (A patir da versão 3.23.51)
IFNULL(expr1,expr2)
Se expr1
não é
NULL
, IFNULL()
retorna expr1
, senão retorna
expr2
. IFNULL()
retorna um valor numérico ou string, dependendo do
contexto no qual é usado:
mysql>SELECT IFNULL(1,0);
-> 1 mysql>SELECT IFNULL(NULL,10);
-> 10 mysql>SELECT IFNULL(1/0,10);
-> 10 mysql>SELECT IFNULL(1/0,'yes');
-> 'yes'
Na versão 4.0.6 e acima o valor resultante padrão de
IFNULL(expr1,expr2)
é o mais geral das
duas expressões, na seguinte ordem:
STRING
, REAL
ou
INTEGER
. A diferença das versões
anteriores é mais notável quando se cria uma tabela
baseada em uma expressão ou o MySQL tem que armazenar
internamente um valor de IFNULL()
em
uma tabela temporária.
CREATE TABLE foo SELECT IFNULL(1,"teste") as teste;
Na versão 4.0.6 do MySQL o tipo da coluna 'teste' é
CHAR(4)
enquanto nas versões
anteriores ela seria do tipo BIGINT
.
NULLIF(expr1,expr2)
Se expr1 = expr2
for verdadeiro, é
retornado NULL
senão é retornado
expr1
. Isto é o mesmo que
CASE WHEN x = y THEN NULL ELSE x END
:
mysql>SELECT NULLIF(1,1);
-> NULL mysql>SELECT NULLIF(1,2);
-> 1
Note que expr1
é avaliada duas vezes
no MySQL se os argumentos não são iguais.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.