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'