MySQL
Tratar con datos escasos o faltantes
Buscar..
Trabajar con columnas que contienen valores NULL
En MySQL y otros dialectos de SQL, los valores NULL
tienen propiedades especiales.
Considere la siguiente tabla que contiene los solicitantes de empleo, las empresas para las que trabajaron y la fecha en que abandonaron la empresa. NULL
indica que un solicitante todavía trabaja en la empresa:
CREATE TABLE example
(`applicant_id` INT, `company_name` VARCHAR(255), `end_date` DATE);
+--------------+-----------------+------------+
| applicant_id | company_name | end_date |
+--------------+-----------------+------------+
| 1 | Google | NULL |
| 1 | Initech | 2013-01-31 |
| 2 | Woodworking.com | 2016-08-25 |
| 2 | NY Times | 2013-11-10 |
| 3 | NFL.com | 2014-04-13 |
+--------------+-----------------+------------+
Su tarea es la de generar una consulta que devuelve todas las filas después de 2016-01-01
, incluyendo cualquier empleado que todavía están trabajando en una empresa (los que tienen NULL
fechas de finalización). Esta declaración de selección:
SELECT * FROM example WHERE end_date > '2016-01-01';
no incluye ninguna fila con valores NULL
:
+--------------+-----------------+------------+
| applicant_id | company_name | end_date |
+--------------+-----------------+------------+
| 2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+
Según la documentación de MySQL , las comparaciones con los operadores aritméticos <,>, = y <> devuelven NULL
lugar de un valor booleano TRUE
o FALSE
. Por lo tanto, una fila con una fecha de NULL
NULA no es mayor que 2016-01-01 ni menor que 2016-01-01.
Esto se puede resolver utilizando las palabras clave IS NULL:
SELECT * FROM example WHERE end_date > '2016-01-01' OR end_date IS NULL;
+--------------+-----------------+------------+
| applicant_id | company_name | end_date |
+--------------+-----------------+------------+
| 1 | Google | NULL |
| 2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+
Trabajar con NULL se vuelve más complejo cuando la tarea involucra funciones de agregación como MAX()
y una cláusula GROUP BY
. Si su tarea fuera seleccionar la fecha de empleo más reciente para cada ID de solicitante, la siguiente consulta parecería un primer intento lógico:
SELECT applicant_id, MAX(end_date) FROM example GROUP BY applicant_id;
+--------------+---------------+
| applicant_id | MAX(end_date) |
+--------------+---------------+
| 1 | 2013-01-31 |
| 2 | 2016-08-25 |
| 3 | 2014-04-13 |
+--------------+---------------+
Sin embargo, sabiendo que NULL
indica que un solicitante aún está empleado en una empresa, la primera fila del resultado es inexacta. El uso de CASE WHEN
proporciona una solución para el problema NULL
:
SELECT
applicant_id,
CASE WHEN MAX(end_date is null) = 1 THEN 'present' ELSE MAX(end_date) END
max_date
FROM example
GROUP BY applicant_id;
+--------------+------------+
| applicant_id | max_date |
+--------------+------------+
| 1 | present |
| 2 | 2016-08-25 |
| 3 | 2014-04-13 |
+--------------+------------+
Este resultado se puede unir de nuevo a la tabla de example
original para determinar la compañía en la que trabajó el solicitante por última vez:
SELECT
data.applicant_id,
data.company_name,
data.max_date
FROM (
SELECT
*,
CASE WHEN end_date is null THEN 'present' ELSE end_date END max_date
FROM example
) data
INNER JOIN (
SELECT
applicant_id,
CASE WHEN MAX(end_date is null) = 1 THEN 'present' ELSE MAX(end_date) END max_date
FROM
example
GROUP BY applicant_id
) j
ON data.applicant_id = j.applicant_id AND data.max_date = j.max_date;
+--------------+-----------------+------------+
| applicant_id | company_name | max_date |
+--------------+-----------------+------------+
| 1 | Google | present |
| 2 | Woodworking.com | 2016-08-25 |
| 3 | NFL.com | 2014-04-13 |
+--------------+-----------------+------------+
Estos son solo algunos ejemplos de NULL
trabajar con valores NULL
en MySQL.