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'