Zum Inhalt
wannacode

CASE und fehlende Werte

Kurz gesagt: CASE WHEN liefert je nach Bedingung einen anderen Wert, COALESCE ersetzt NULL durch einen Standardwert, und NULLIF macht aus einem bestimmten Wert NULL.

Problem

Wörter statt Codes

Auf der Seite „Meine Bestellungen“ sieht der Kunde den Status so, wie er in der Datenbank steht: paid, shipped. Die Codes sind für das Programm praktisch, aber der Kunde erwartet „Bezahlt“ und „Unterwegs“.

Die Website will außerdem einen Filter „günstig, mittel, teuer“. So eine Spalte gibt es in der Datenbank nicht, nur einen Preis.

Die Idee

CASE WHEN

CASE liefert je nach Bedingung einen anderen Wert:

SQLDatenbank: Shop

Die Bedingungen werden von oben nach unten geprüft. Das erste wahre WHEN liefert den Wert des danebenstehenden THEN, die übrigen werden nicht angesehen. ELSE ist für alles, wofür nichts wahr ist. END schließt den Ausdruck, und AS gibt ihm einen Namen.

Wenn du eine Spalte mit mehreren Werten vergleichst, gibt es eine kürzere Form: Die Spalte steht einmal hinter CASE, und jedes WHEN enthält nur den Wert:

SQLDatenbank: Shop

Probier es aus

Die Status in Worten

Zeige Nummer, Datum und den Status in Worten jeder Bestellung, in einer Spalte namens status_text: new ist „Eingegangen“, paid ist „Bezahlt“, shipped ist „Unterwegs“, delivered ist „Zugestellt“, cancelled ist „Storniert“.

SQLDatenbank: Shop

Sieh es dir an

Die teuren sind verschwunden

Ein Kollege schreibt die Preisgruppen mit > um. Führe es aus und sieh dir die Küche an:

SQLDatenbank: Shop
1. Warum wurde die Bratpfanne für 24,90 € als „mittel“ eingestuft?

Noch etwas: Wenn es kein ELSE gibt und kein WHEN wahr ist, ist das Ergebnis NULL. Die Brote bekommen nur dann eine Notiz, wenn sie ausverkauft sind oder zur Neige gehen:

SQLDatenbank: Shop

Manchmal ist das genau das, was du willst. Wenn nicht, schreib ELSE.

Die Idee

COALESCE und NULLIF

COALESCE(a, b, …) liefert den ersten Wert, der nicht NULL ist. So setzt du ein Wort an die Stelle von dem, was fehlt:

SQLDatenbank: Shop

Manchmal ist „fehlt“ nicht als NULL gespeichert, sondern als leerer Text. In den beiden folgenden Beispielen hat die Datenbank einen Kunden mehr, Anna, gespeichert über ein Formular, das '' statt NULL sendet. COALESCE fängt sie nicht auf, denn leerer Text ist ein Wert:

SQLDatenbank: Shop

NULLIF(a, b) liefert NULL, wenn a gleich b ist, sonst a. So wird der leere Text zu NULL, und COALESCE fängt beide Kunden auf:

SQLDatenbank: Shop
Genauer, für Neugierige

NULLIF benutzt man auch bei der Division: total / NULLIF(count, 0). Ist count gleich 0, wird der Divisor NULL und damit auch das Ergebnis. In SQLite ergibt eine Division durch null ohnehin NULL, in PostgreSQL aber einen Fehler, der die ganze Abfrage stoppt.

Probier es aus

Die Zeile für den Kurier

Korrigiere die Zeile „Name, Stadt“ aus der Lektion über Text: Wenn die Stadt fehlt, soll an ihrer Stelle „keine Stadt“ stehen. Die Spalte soll contact heißen.

SQLDatenbank: Shop

Übung

Zwei Aufgaben

1. Neben jedem Produkt zeigt die Website den Lagerbestand in Worten: „ausverkauft“ bei 0, „letzte Stücke“ unter 10, sonst „auf Lager“. Zeige Name, Lagerbestand und die Worte in einer Spalte namens availability.

Der Lagerbestand in Worten für jedes Produkt:

SQLDatenbank: Shop

2. Das Lager arbeitet in dieser Reihenfolge: Zuerst packt es die bezahlten Bestellungen (paid), dann sieht es sich die neuen an (new), und zuletzt prüft es die verschickten (shipped). Zeige Nummer, Status und Datum dieser Bestellungen in der Arbeitsreihenfolge, und innerhalb eines Status die älteste zuerst. Bei gleichem Datum die kleinere Nummer zuerst.

Die offenen Bestellungen in der Reihenfolge, in der das Lager sie bearbeitet:

SQLDatenbank: Shop
Genauer, für Neugierige

SQLite hat auch IIF(Bedingung, wenn wahr, wenn nicht): ein kurzes CASE mit einem WHEN und einem ELSE. SQL Server hat es ebenfalls, PostgreSQL aber nicht. CASE ist die Standardform und funktioniert überall.

SQLDatenbank: Shop

Test

Teste dich

1. Was liefert CASE, wenn kein WHEN wahr ist und es kein ELSE gibt?
2. Was liefert COALESCE(NULL, NULL, 'Sofia', 'Varna')?
3. Was liefert NULLIF(city, '') für eine Stadt, die leerer Text ist?
4. Wo kann CASE stehen?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·