Funções de Fluxo de Controle
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
eexpr1 <> NULL
) entãoIF()
retornaexpr2
, senão ela retornaexpr3
.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
ouexpr3
é explicitamenteNULL
então o tipo resultante da funçãoIF()
é o tipo da coluna nãoNULL
. (Este comportamento é novo na versão 4.0.3 do MariaDB).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);
-> 1No primeiro caso acima,
IF(0.1)
retorna0
porque0.1
é convertido para um valor inteiro, resultando um um testeIF(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 MariaDB 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()
retornaexpr1
, senão retornaexpr2
.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
ouINTEGER
. A diferença das versões anteriores é mais notável quando se cria uma tabela baseada em uma expressão ou o MariaDB tem que armazenar internamente um valor deIFNULL()
em uma tabela temporária.CREATE TABLE foo SELECT IFNULL(1,'teste') as teste;
Na versão 4.0.6 do MariaDB o tipo da coluna 'teste' é
CHAR(4)
enquanto nas versões anteriores ela seria do tipoBIGINT
.NULLIF(expr1,expr2)
Se
expr1 = expr2
for verdadeiro, é retornadoNULL
senão é retornadoexpr1
. Isto é o mesmo queCASE WHEN x = y THEN NULL ELSE x END
:mysql>
SELECT NULLIF(1,1);
-> NULL mysql>SELECT NULLIF(1,2);
-> 1Note que
expr1
é avaliada duas vezes no MariaDB se os argumentos não são iguais.