MySQL: Order By – NULL-Werte

Die Tabelle ‚verzeichnis‘ sieht so aus:

id | reihenfolge | name
——————————————
1  | 2                | Klaus
2  | 1                | Rolf
3  | NULL          | Annika
4  |3                 | Jürgen

Nun möchte man per SQL die id und name in der angegebenen Reihenfolge ausgeben. Es stellt sich allerdings heraus, dass diese Abfrage:
[code lang=’sql‘]
SELECT
id,
name
FROM
verzeichnis
ORDER BY
reihenfolge ASC
[/code]
Nicht zum gewünschten Ergebnis führt, denn der Datensatz ohne Angabe einer Reihenfolge (NULL) wird als erstes ausgegeben, er soll aber als letztes ausgegeben werden. Um NULL-Werte hinter anderen Datensätzen auszugeben, muss dieser SQL-Ausdruck genutzt werden:
[code lang=’sql‘]
SELECT
id,
name
FROM
verzeichnis
ORDER BY
IF(ISNULL(reihenfolge),1,0) ASC,
reihenfolge ASC
[/code]
Warum gibt dieser Ausdruck genau das zurück, was wir haben wollen?
Das erste Sortierkriterium IF(ISNULL(reihenfolge),1,0) ASC ist dann eine 1, wenn reihenfolge NULL ist und sonst 0. Da wir aufsteigend sortieren, ist 0 (die Datensätze, deren reihenfolge nicht NULL sind) vor 1 (die Datensätze, deren reihenfolge NULL sind). Innerhalb derer wird mit dem zweiten Sortierkriterium reihenfolge ASC wiederum sortiert, so dass die gewünschte Reihenfolge ausgegeben wird.
Rock’n’Roll Neandertaler hat einen noch eleganteren Ausdruck:
[code lang=’sql‘]
SELECT
id,
name
FROM
verzeichnis
ORDER BY
reihenfolge IS NULL,
reihenfolge
[/code]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.