MySQL
Umgang mit spärlichen oder fehlenden Daten
Suche…
Mit Spalten arbeiten, die NULL-Werte enthalten
In MySQL und anderen SQL-Dialekten haben NULL
Werte besondere Eigenschaften.
Betrachten Sie die folgende Tabelle mit den Bewerbern, den Unternehmen, für die sie gearbeitet haben, und dem Datum, an dem sie das Unternehmen verlassen haben. NULL
bedeutet, dass ein Bewerber noch im Unternehmen arbeitet:
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 |
+--------------+-----------------+------------+
Ihre Aufgabe ist es, eine Abfrage zu 2016-01-01
, in der alle Zeilen nach dem 2016-01-01
, einschließlich aller Mitarbeiter, die noch in einem Unternehmen arbeiten (Mitarbeiter mit NULL
Enddatum). Diese Select-Anweisung:
SELECT * FROM example WHERE end_date > '2016-01-01';
schlägt fehl, Zeilen mit NULL
Werten aufzunehmen:
+--------------+-----------------+------------+
| applicant_id | company_name | end_date |
+--------------+-----------------+------------+
| 2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+
Gemäß der MySQL-Dokumentation geben Vergleiche mit den arithmetischen Operatoren <,>, = und <> selbst NULL
anstelle eines booleschen TRUE
oder FALSE
. Eine Zeile mit einem NULL
end_date ist daher weder größer als 2016-01-01 oder kleiner als 2016-01-01.
Dies kann mit den Schlüsselwörtern IS NULL gelöst werden:
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 |
+--------------+-----------------+------------+
Das Arbeiten mit NULL-Werten wird komplexer, wenn die Aufgabe Aggregationsfunktionen wie MAX()
und eine GROUP BY
Klausel beinhaltet. Wenn Ihre Aufgabe darin bestand, das letzte verwendete Datum für jede Bewerber-ID auszuwählen, erscheint die folgende Abfrage als logischer erster Versuch:
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 |
+--------------+---------------+
In dem Wissen, dass NULL
bedeutet, dass ein Bewerber noch in einem Unternehmen beschäftigt ist, ist die erste Zeile des Ergebnisses ungenau. CASE WHEN
bietet eine Problemumgehung für das NULL
Problem:
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 |
+--------------+------------+
Dieses Ergebnis kann mit der ursprünglichen example
werden, um die Firma zu bestimmen, bei der ein Bewerber zuletzt gearbeitet hat:
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 |
+--------------+-----------------+------------+
Dies sind nur einige Beispiele für die Arbeit mit NULL
Werten in MySQL.