Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL NULLIF() explicado


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'