Snippet: NULL-Werte nach hinten sortieren in MySQL
6. Februar 2011
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 »




WEB-Letter

Kommentare und Anmerkungen
Es gibt leider noch keine Kommentare. Schreiben Sie doch einen ...
RSS Feed für Kommentare zu diesem Artikel. TrackBack URL
Hinterlasse einen Kommentar