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 <> 0eexpr1 <> 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
expr2ouexpr3é explicitamenteNULLentã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)retorna0porque0.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
expr1nã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,REALouINTEGER. 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 = expr2for verdadeiro, é retornadoNULLsenã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.