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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow