Nullwerte in einer Spalte werden in MySQL standardmäßig vor dem Alphabet einsortiert. Das bedeutet, dass die Datensätze ohne Wert in einer alphabetisch sortierten Spalte ganz oben stehen. Das ist aber nicht immer gewünscht.

Ein Anwendungsfall ist z. B. eine Kontaktliste mit Wiedervorlage-Datum.

Dies könnte eine einfache Datenstruktur einer solchen Tabelle sein:

CREATE TABLE `kontakt` (
`id` smallint(3) unsigned NOT NULL auto_increment,
`kunde_id` smallint(3) unsigned NOT NULL,
`datum` timestamp NOT NULL default CURRENT_TIMESTAMP,
`gespraechspartner` varchar(40) NOT NULL,
`thema` varchar(70) NOT NULL,
`notiz` text NOT NULL,
`wiedervorlage` date default NULL,
PRIMARY KEY  (`id`)
) ;

Diese Tabelle kann natürlich nach Belieben um weitere Daten ergänzt werden. In der Spalte datum steht das Gesprächsdatum, während wiedervorlage das Datum enthält, an dem der Gesprächspartner erneut kontaktiert werden soll. Wenn wir nun eine Liste aller Kontakte ausgeben, sollen Datensätze, die eine Wiedervorlage haben, natürlich ganz oben erscheinen. Dabei soll aufsteigend sortiert werden, d. h. früher fällige Datensätze sollen auch weiter oben in der Liste erscheinen, z. B. so:

Wiedervorlage Gesprächsdatum Gesprächspartner Thema
31.01.2011 10.01.2011 Hr. Schneider Fragen zum Angebot
10.03.2011 17.11.2011 Fr. Jakobsen Buch-Projekt
12.01.2011 Hr. Schulze Für Auftrag bedankt
… Ältere Kontakte, die erledigt sind …

Wenn ich nun aber mein Select einfach nach wiedervorlage sortiere, stehen per Default ganz oben die Datensätze, die keinen Wert in Wiedervorlage haben, also eigentlich abgeschlossen sind.

SELECT * FROM kontakt ORDER BY wiedervorlage, datum DESC;
Wiedervorlage Gesprächsdatum Gesprächspartner Thema
12.01.2011 Hr. Schulze Für Auftrag bedankt
… Ältere Kontakte, die erledigt sind …
31.01.2011 10.01.2011 Hr. Schneider Fragen zum Angebot
10.03.2011 17.11.2011 Fr. Jakobsen Buch-Projekt

Nun könnte man sagen, wir teilen es einfach in zwei Abfragen auf; zuerst die mit Wiedervorlage, dann die ohne; und bauen dann daraus die Liste zusammen. Kann man machen. Es geht aber auch einfacher.

Die folgende Anweisung sortiert Nullwerte an das Ende der Liste, die restlichen Werte wie gewünscht alphabetisch. Dies entspricht der NULLS LAST Anweisung von ANSI SQL.

SELECT * FROM kontakt ORDER BY IF(ISNULL(wiedervorlage),1,0),wiedervorlage ASC, datum DESC;

Damit werden die Werte sortiert, wie ich es mir wünsche.

Themen: MySQL | Noch kein Kommentar »