No MySQL,
NULLIF()
é uma função de controle de fluxo que retorna NULL
se ambos os argumentos forem equivalentes. Caso contrário, ele retorna o primeiro argumento. Sintaxe
A sintaxe fica assim:
NULLIF(expr1,expr2)
Exemplo
Segue um exemplo para demonstrar:
SELECT NULLIF( 7, 7 );
Resultado:
NULL
Nesse caso, ambos os argumentos são idênticos e, portanto, o resultado é
NULL
. Quando os argumentos não são equivalentes
Aqui está o que acontece quando os argumentos não são equivalentes:
SELECT NULLIF( 7, 8 );
Resultado:
7
Os argumentos são diferentes e, portanto, o primeiro argumento é retornado.
Cordas
Aqui está um exemplo que compara strings:
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Resultado:
Same Different ---- --------- NULL Bean
Datas
Aqui está um exemplo que compara datas:
SELECT
NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";
Resultado:
Same Different ---- ---------- NULL 2030-12-20
Expressões
NULLIF()
avalia o valor atual das expressões. Portanto, se passarmos uma expressão como esta:SELECT NULLIF( 8, 2 * 4 );
Obtemos isso:
NULL
2 multiplicado por 4 é 8, então os dois argumentos são equivalentes.
Aqui está o que acontece se alterarmos o segundo argumento:
SELECT NULLIF( 8, 2 * 3 );
Resultado:
8
O primeiro argumento é retornado.
Um exemplo de banco de dados
Suponha que executemos a seguinte consulta:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Resultado:
+-------------------------------+--------------------------------+ | Name | LocalName | +-------------------------------+--------------------------------+ | Albania | Shqipëria | | Andorra | Andorra | | Bosnia and Herzegovina | Bosna i Hercegovina | | Croatia | Hrvatska | | Gibraltar | Gibraltar | | Greece | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | | Italy | Italia | | Macedonia | Makedonija | | Malta | Malta | | Portugal | Portugal | | San Marino | San Marino | | Slovenia | Slovenija | | Spain | España | | Yugoslavia | Jugoslavija | +-------------------------------+--------------------------------+
Aqui, temos os nomes dos países na coluna da esquerda e o nome local do respectivo país à direita.
Vamos adicionar
NULLIF()
para uma terceira coluna de nossa consulta:SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Resultado:
+-------------------------------+--------------------------------+--------------------------------+ | Name | LocalName | Local Name if Different | +-------------------------------+--------------------------------+--------------------------------+ | Albania | Shqipëria | Shqipëria | | Andorra | Andorra | NULL | | Bosnia and Herzegovina | Bosna i Hercegovina | Bosna i Hercegovina | | Croatia | Hrvatska | Hrvatska | | Gibraltar | Gibraltar | NULL | | Greece | Elláda | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | Santa Sede/Città del Vaticano | | Italy | Italia | Italia | | Macedonia | Makedonija | Makedonija | | Malta | Malta | NULL | | Portugal | Portugal | NULL | | San Marino | San Marino | NULL | | Slovenia | Slovenija | Slovenija | | Spain | España | España | | Yugoslavia | Jugoslavija | Jugoslavija | +-------------------------------+--------------------------------+--------------------------------+
Podemos ver que a terceira coluna retorna o nome local apenas se for diferente do valor no
Name
coluna. Se for o mesmo, então NULL
é devolvido. Também podemos usar
NULLIF()
para filtrar nossos resultados de consulta:SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Resultado:
+-------------------------------+--------------------------------+ | Name | LocalName | +-------------------------------+--------------------------------+ | Albania | Shqipëria | | Bosnia and Herzegovina | Bosna i Hercegovina | | Croatia | Hrvatska | | Greece | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | | Italy | Italia | | Macedonia | Makedonija | | Slovenia | Slovenija | | Spain | España | | Yugoslavia | Jugoslavija | +-------------------------------+--------------------------------+
Nesse caso, retornamos apenas as linhas em que o nome local é diferente do
Name
coluna. NULLIF()
vs CASE
O seguinte código:
NULLIF(expr1,expr2)
é equivalente ao seguinte
CASE
expressão:CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
Contagem de parâmetros incorreta
Passar o número errado de argumentos resulta em um erro:
SELECT NULLIF( 5 );
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'