sql >> Base de Datos >  >> RDS >> MariaDB

MariaDB NULLIF () explicado

En MariaDB, el NULLIF() la función devuelve NULL si sus dos argumentos son equivalentes. De lo contrario, devuelve el primer argumento.

Sintaxis

La sintaxis es así:

NULLIF(expr1,expr2)

Ejemplo

Aquí hay un ejemplo para demostrarlo:

SELECT NULLIF( 5, 5 );

Resultado:

NULL

En este caso, ambos argumentos son idénticos y el resultado es NULL .

Cuando los argumentos no son equivalentes

Esto es lo que sucede cuando los argumentos no son equivalentes:

SELECT NULLIF( 5, 3 );

Resultado:

5

En este caso, se devuelve el primer argumento.

Cuerdas

Aquí hay un ejemplo que compara cadenas:

SELECT 
    NULLIF( 'Papaya', 'Papaya' ) AS "Same",
    NULLIF( 'Papaya', 'Salad' ) AS "Different";

Resultado:

+------+-----------+
| Same | Different |
+------+-----------+
| NULL | Papaya    |
+------+-----------+

Fechas

Aquí hay un ejemplo que compara fechas:

SELECT 
    NULLIF( DATE '2000-10-30', DATE '2000-10-30' ) AS "Same",
    NULLIF( DATE '2000-10-30', DATE '1999-10-30' ) AS "Different";

Resultado:

+------+------------+
| Same | Different  |
+------+------------+
| NULL | 2000-10-30 |
+------+------------+

Expresiones

NULLIF() evalúa el valor actual de las expresiones. Por lo tanto, si pasamos una expresión como esta:

SELECT NULLIF( 10, 2 * 5 );

Obtenemos esto:

NULL

2 multiplicado por 5 es 10, por lo que los dos argumentos son equivalentes.

Esto es lo que sucede si cambiamos el segundo argumento:

SELECT NULLIF( 10, 3 * 5 );

Resultado:

10

Se devuelve el primer argumento.

Un ejemplo de base de datos

Supongamos que ejecutamos la siguiente consulta:

SELECT 
    Name,
    LocalName
FROM country 
ORDER BY Name ASC
LIMIT 10;

Resultado:

+---------------------+-----------------------+
| Name                | LocalName             |
+---------------------+-----------------------+
| Afghanistan         | Afganistan/Afqanestan |
| Albania             | Shqipëria             |
| Algeria             | Al-Jaza’ir/Algérie    |
| American Samoa      | Amerika Samoa         |
| Andorra             | Andorra               |
| Angola              | Angola                |
| Anguilla            | Anguilla              |
| Antarctica          | –                     |
| Antigua and Barbuda | Antigua and Barbuda   |
| Argentina           | Argentina             |
+---------------------+-----------------------+

Aquí tenemos los nombres de los países en la columna de la izquierda y el nombre local del país respectivo en la derecha.

Agreguemos NULLIF() a una tercera columna de nuestra consulta:

SELECT 
    Name,
    LocalName,
    NULLIF(LocalName, Name) AS "Local Name Different"
FROM country 
ORDER BY Name ASC
LIMIT 10;

Resultado:

+---------------------+-----------------------+-----------------------+
| Name                | LocalName             | Local Name Different  |
+---------------------+-----------------------+-----------------------+
| Afghanistan         | Afganistan/Afqanestan | Afganistan/Afqanestan |
| Albania             | Shqipëria             | Shqipëria             |
| Algeria             | Al-Jaza’ir/Algérie    | Al-Jaza’ir/Algérie    |
| American Samoa      | Amerika Samoa         | Amerika Samoa         |
| Andorra             | Andorra               | NULL                  |
| Angola              | Angola                | NULL                  |
| Anguilla            | Anguilla              | NULL                  |
| Antarctica          | –                     | –                     |
| Antigua and Barbuda | Antigua and Barbuda   | NULL                  |
| Argentina           | Argentina             | NULL                  |
+---------------------+-----------------------+-----------------------+

Podemos ver que la tercera columna devuelve el nombre local solo si es diferente al valor en Name columna. Si es lo mismo, entonces NULL es devuelto.

Alternativamente, podemos usar NULLIF() para filtrar los resultados de nuestra consulta:

SELECT 
    Name,
    LocalName
FROM country 
WHERE NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name ASC
LIMIT 10;

Resultado:

+----------------+-----------------------+
| Name           | LocalName             |
+----------------+-----------------------+
| Afghanistan    | Afganistan/Afqanestan |
| Albania        | Shqipëria             |
| Algeria        | Al-Jaza’ir/Algérie    |
| American Samoa | Amerika Samoa         |
| Antarctica     | –                     |
| Armenia        | Hajastan              |
| Austria        | Österreich            |
| Azerbaijan     | Azärbaycan            |
| Bahamas        | The Bahamas           |
| Bahrain        | Al-Bahrayn            |
+----------------+-----------------------+

En este caso, devolvimos solo aquellas filas donde el nombre local es diferente al Name columna.

NULLIF() vs CASE

El siguiente código:

NULLIF(expr1,expr2)

es equivalente al siguiente CASE expresión:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Recuento de parámetros incorrecto

Pasar el número incorrecto de argumentos da como resultado un error:

SELECT NULLIF( 10 );

Resultado:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'