Kurs
Bedingte Ausdrücke sind eines der grundlegendsten Elemente eines jeden Programmierparadigmas. Zu den üblichen bedingten Ausdrücken gehören if-else
Blöcke und switch
Fälle. Du kannst in PostgreSQL bedingte Ausdrücke formulieren, indem du WHEN-THEN
case verwendest, das den if-else
Blöcken sehr ähnlich ist. In diesem Lernprogramm erfährst du, wie das geht.
Bevor du mit dem Schreiben von Bedingungsabfragen beginnst, ist es wichtig, dass du eine lokale PostgreSQL-Datenbank einrichtest. Das wirst du im ersten Abschnitt dieses Tutorials tun.
Hinweis: Um diesem Lernprogramm folgen zu können, musst du die Grundlagen von SQL und PostgreSQL kennen. Mit den folgenden Ressourcen kannst du die Grundlagen auffrischen:
Eine PostgreSQL-Datenbank lokal einrichten
Du kannst diese Sicherungsdatei verwenden und sie auf deinem PostgreSQL-Server wiederherstellen. Wenn du wissen willst, wie du das machst, kannst du diesen Artikel lesen. Nachdem du die Sicherung erfolgreich wiederhergestellt hast, solltest du diese Tabellen in der Datenbank sehen können -
- Länder
- route_table
- station_table
- train_table
In diesem Lehrgang wird jedoch nur die Tabelle countries
verwendet. Du kannst die Tabellen in der Datenbanksicherung erkunden. Vielleicht möchtest du auch deine eigenen Datenbanken und Tabellen erstellen. Wenn du das Datenbank-Backup wiederhergestellt hast, solltest du jetzt eine Tabelle (mit den Details zu den verschiedenen Ländern rund um den Globus) haben. Schauen wir uns nun kurz die Tabelle countries
an.
Die Erkundung der countries
Tabelle ganz kurz
Nachdem du die Datenbank wiederhergestellt hast, kannst du die Tabelle in der Oberfläche pgAdmin
anzeigen, die mit der Standardinstallation von PostgreSQL geliefert wird. Wenn du eine einfache SELECT
Anweisung ausführst, erfährst du etwas über die Spalten, ihre Datentypen und die Zeilen, die die Tabelle enthält.
Die Tabelle enthält Angaben zu insgesamt 206 verschiedenen Ländern aus unterschiedlichen Regionen der Welt. Wie viele Regionen genau? Die folgende Abfrage sollte dir die Antwort auf deine Frage geben.
SELECT COUNT(DISTINCT(region)) from countries;
In dieser Tabelle werden 23 verschiedene Regionen abgedeckt, z. B. Westeuropa, Polynesien, der Nahe Osten und so weiter. Du kannst die Tabelle mit deinen eigenen schnellen Fragen erkunden und dabei vielleicht interessante Fakten herausfinden. Sehen wir uns nun die Anatomie eines einfachen PostgreSQL CASE
an.
Werde Dateningenieur
Einführung in PostgreSQL CASE
Im Folgenden wird die allgemeine Form eines PostgreSQL-Falls mit dem WHEN-THEN
-Konstrukt beschrieben -
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
ELSE result_n
END
Hier sind einige wichtige Punkte, die du bei der Erstellung von CASE
s in PostgreSQL beachten solltest:
-
Jede Bedingung ist ein boolescher Ausdruck und je nach Ausgabe wird das Ergebnis ausgewählt. Wenn alle Ausdrücke, die
WHEN
entsprechen, zuFalse
ausgewertet werden, dann wird das Ergebnis für denELSE
Teil angezeigt. Wenn du den TeilELSE
nicht angibst, wird die Abfrage null zurückgeben. -
Eine Bedingung wird in der Regel auf eine Spalte angewendet, die in der Tabelle vorhanden ist, die du bearbeitest. Bedingte Abfragekonstrukte wie die oben genannten werden in der Regel mit
SELECT
Anweisungen ausgeführt. Beachte, dass die Spalte in derSELECT
Anweisung deiner Abfrage vorhanden sein muss, für die du die booleschen Ausdrücke angibst (inCASE
). Aber wenn duCASE
in Verbindung mit einer Where-Klausel verwendest, musst du das nicht beachten (mehr dazu später). -
Der Datentyp der Ergebnisse muss einheitlich sein. Du kannst nicht ein
string
inresult_1
und eininteger
inresult_2
und so weiter zurückgeben.
Schauen wir uns jetzt ein paar Beispiele an.
Writing PostgreSQL CASE
s
Lass uns einfach anfangen. Du wirst nun eine CASE
schreiben, um die Länder nach dem Jahr der Unabhängigkeit zu gruppieren. Unabhängigkeitsjahre werden in der Spalte indep_year
eingetragen. Nehmen wir an, du hast drei Gruppen von Unabhängigkeitsjahren der Länder, die du verfolgen musst. Du wirst dafür drei Gruppen von Unabhängigkeitsjahren bilden -
- Vor 1900 (
indep_year < 1900
) - Zwischen 1900 und 1930 (
indep_year <= 1930
) - Nach 1930 (
indep_year > 1930
)
Das Endergebnis der Abfrage sollte die folgenden Spalten enthalten -
- Name (des Landes)
- Kontinent (zu dem das Land gehört)
- indep_year
- Und die Gruppe der Unabhängigkeitsjahre, die du gründen wirst. Nennen wir sie
indep_year_group
.
Schreiben wir nun die Abfrage -
SELECT name, continent, indep_year,
CASE WHEN indep_year < 1900 THEN 'before 1900'
WHEN indep_year <= 1930 THEN 'between 1900 and 1930'
ELSE 'after 1930' END
AS indep_year_group
FROM countries
ORDER BY indep_year_group;
(Die Abfrage stammt aus dem DataCamp-Kurs " Joining Data in SQL ").
Wenn du die Abfrage ausführst, siehst du viele Länder wie Palästina, Puerto Rico usw., für die in der Tabelle kein Unabhängigkeitsjahr angegeben ist. Deshalb haben sie die Gruppe between 1900 and 1930
.
PostgreSQL CASE
s kann mehrere Bedingungen haben. Es gibt eine Handvoll Einträge in der Tabelle, bei denen der Name des Landes und der Hauptstadt identisch sind. Du kannst dies zu deinem zuvor erstellten CASE
- hinzufügen.
SELECT name, continent, indep_year,
CASE WHEN (indep_year < 1900) AND (countries.name = countries.capital) THEN 'before 1900 and capital same'
WHEN indep_year <= 1930 AND (countries.name = countries.capital) THEN 'between 1900 and 1930 and capital same'
ELSE 'after 1930_and_no_same_capital' END
AS indep_year_group
FROM countries
ORDER BY indep_year_group;
Eine weitere spannende Sache an CASE
ist, dass du sie mit Aggregatfunktionen wie SUM()
koppeln kannst. Um eine CASE
mit der Aggregatfunktion SUM()
zu implementieren, benötigst du eine andere Tabelle, in der dies sinnvoll sein könnte. Erstellen wir eine einfache Tabelle namens student_grades
mit den folgenden Spalten und Datentypen -
- student_name (string)
- student_stream (string)
- student_grade (character)
Die folgende Abfrage erstellt die Tabelle für dich -
CREATE TABLE student_grades
(student_name character varying,
student_stream character varying,
student_grade character);
Lass uns jetzt einige Datensätze in die Tabelle einfügen. Du kannst dies mit ein paar INSERT
Anweisungen tun. Nehmen wir an, dass die Tabelle student_grades
nach den Einfügungen nun die folgenden Datensätze enthält -
Jetzt schreibst du eine CASE
, um die Summe der Schüler zu ermitteln, die zu bestimmten Klassenstufen gehören. Wie du siehst, gibt es nach den Instanzen der Tabelle drei verschiedene Klassen - A, B und C. Die bedingte Abfrage sollte eine Ausgabe ähnlich der folgenden liefern -
Die Abfrage für diese -
SELECT
SUM (
CASE
WHEN student_grade = 'A' THEN
1
ELSE
0
END
) AS "High Scoring",
SUM (
CASE
WHEN student_grade = 'B' THEN
1
ELSE
0
END
) AS "Mid Scoring",
SUM (
CASE
WHEN student_grade = 'C' THEN
1
ELSE
0
END
) AS "Low Scoring"
FROM
student_grades;
So kannst du CASE
mit Aggregatfunktionen verknüpfen, um interessante Fakten über die Daten zu erhalten.
Fazit und weiterführende Literatur
Das ist alles für dieses Tutorial. In diesem Tutorial hast du gelernt, wie du if-then
wie Konditionierung in deine SQL-Abfragen einbindest, um interessante Auswertungen zu erhalten. Du hast mehrere Beispiele durchgearbeitet, um diese Fähigkeit zu stärken. Wenn du auf der Suche nach anspruchsvolleren Übungen bist, solltest du die folgenden DataCamp-Kurse zu SQL besuchen -
Wenn du Fragen zu diesem Tutorial hast, kannst du sie mir gerne im Comments
Bereich stellen.