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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow