En MySQL, NULLIF()
es una función de control de flujo que 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( 7, 7 );
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( 7, 8 );
Resultado:
7
Los argumentos son diferentes, por lo que se devuelve el primer argumento.
Cuerdas
Aquí hay un ejemplo que compara cadenas:
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Resultado:
Same Different ---- --------- NULL Bean
Fechas
Aquí hay un ejemplo que compara fechas:
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
Expresiones
NULLIF()
evalúa el valor actual de las expresiones. Por lo tanto, si pasamos una expresión como esta:
SELECT NULLIF( 8, 2 * 4 );
Obtenemos esto:
NULL
2 multiplicado por 4 es 8, por lo que los dos argumentos son equivalentes.
Esto es lo que sucede si cambiamos el segundo argumento:
SELECT NULLIF( 8, 2 * 3 );
Resultado:
8
Se devuelve el primer argumento.
Un ejemplo de base de datos
Supongamos que ejecutamos la siguiente 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 | +-------------------------------+--------------------------------+
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 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 la tercera columna devuelve el nombre local solo si es diferente al valor en Name
columna. Si es lo mismo, entonces NULL
es devuelto.
También podemos usar NULLIF()
para filtrar los resultados de nuestra 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 | +-------------------------------+--------------------------------+
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( 5 );
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'