CASE-Ausdrücke in SQL: So wenden Sie Bedingungen an

Einführung

Programmiersprachen beinhalten typischerweise bedingte Anweisungen, also Befehle, die eine bestimmte Aktion ausführen, bis eine Bedingung erfüllt ist. Eine häufige bedingte Anweisung ist die if-then-else-Anweisung, die im Allgemeinen dieser Logik folgt:

if Bedingung=true

dann Aktion A

sonst Aktion B

Die Logik dieser Anweisung lautet: „Wenn die Bedingung wahr ist, führe Aktion A aus. Andernfalls (else) führe Aktion B aus.“

CASE-Ausdrücke in SQL sind ein Merkmal der Structured Query Language (SQL), das es ermöglicht, ähnliche Logik auf Datenbankabfragen anzuwenden und Bedingungen dafür festzulegen, wie die Werte im Ergebnisset zurückgegeben oder angezeigt werden sollen.

In diesem Tutorial lernen Sie, wie Sie den CASE-Ausdruck verwenden, um Bedingungen für Ihre Daten mithilfe der Schlüsselwörter WHEN, THEN, ELSE und END festzulegen.

Voraussetzungen für CASE-Ausdrücke in SQL

Um dieses Tutorial abzuschließen, benötigen Sie:

  • Einen Server mit Ubuntu 20.04, einen Nicht-Root-Benutzer mit sudo-Rechten und eine aktivierte Firewall. Befolgen Sie unser Initial Server Setup with Ubuntu 20.04, um zu beginnen.
  • MySQL auf dem Server installiert und abgesichert. Folgen Sie unserem How To Install MySQL on Ubuntu 20.04, um dies einzurichten. Diese Anleitung geht davon aus, dass Sie auch einen MySQL-Benutzer ohne Root-Rechte eingerichtet haben, wie in Schritt 3 dieser Anleitung beschrieben.

Hinweis: Viele relationale Datenbankverwaltungssysteme verwenden ihre eigenen Implementierungen von SQL. Die in diesem Tutorial beschriebenen Befehle funktionieren auf den meisten RDBMS, aber die genaue Syntax oder Ausgabe kann unterschiedlich sein, wenn Sie diese Befehle auf einem anderen System als MySQL testen.

Um die Verwendung von CASE-Ausdrücken in SQL in diesem Tutorial zu üben, benötigen Sie eine Datenbank und eine Tabelle mit Beispieldaten. Wenn Sie keine bereit zum Einfügen haben, können Sie im folgenden Abschnitt „Verbindung zu MySQL und Einrichten einer Beispieldatenbank“ nachlesen, wie Sie eine Datenbank und eine Tabelle erstellen. In diesem Tutorial wird auf diese Beispieldatenbank und Tabelle verwiesen.

Verbindung zu MySQL und Einrichten einer Beispieldatenbank

Wenn Ihre SQL-Datenbank auf einem Remote-Server läuft, melden Sie sich per SSH von Ihrem lokalen Computer bei Ihrem Server an:

Öffnen Sie als Nächstes die MySQL-Eingabeaufforderung, indem Sie „sammy“ durch Ihre MySQL-Benutzerinformationen ersetzen:

Erstellen Sie eine Datenbank namens caseDB:

Wenn die Datenbank erfolgreich erstellt wurde, erhalten Sie die folgende Ausgabe:

Ausgabe
Query OK, 1 row affected (0.01 sec)

Um die Datenbank caseDB auszuwählen, führen Sie die folgende USE-Anweisung aus:

Ausgabe
Datenbank geändert

Nachdem Sie die Datenbank ausgewählt haben, erstellen Sie darin eine Tabelle. Für die Beispiele in diesem Tutorial erstellen wir eine Tabelle, die Daten zu den zehn meistverkauften Alben aller Zeiten enthält. Diese Tabelle wird die folgenden sechs Spalten enthalten:

  • music_id: zeigt Werte des int-Datentyps an und dient als Primärschlüssel der Tabelle, d.h. jeder Wert in dieser Spalte fungiert als eindeutiger Bezeichner für die jeweilige Zeile.
  • artist_name: speichert die Namen der Künstler mit dem Datentyp varchar und einer maximalen Länge von 30 Zeichen.
  • album_name: verwendet ebenfalls den Datentyp varchar mit einer maximalen Länge von 30 Zeichen, um die Namen der einzelnen Alben zu speichern.
  • release_date: verfolgt das Veröffentlichungsdatum jedes Albums mit dem Datentyp DATE, der das Datumsformat JJJJ-MM-TT verwendet.
  • genre_type: zeigt die Genre-Klassifizierung für jedes Album mit dem varchar-Datentyp und einer maximalen Länge von 25 Zeichen an.
  • copies_sold: verwendet den Dezimaldatentyp, um die Gesamtzahl der in Millionen verkauften Alben zu speichern. Diese Spalte gibt eine Genauigkeit von vier mit einer Skala von eins an, d.h. Werte in dieser Spalte können vier Ziffern haben, wobei eine dieser Ziffern rechts vom Dezimalpunkt steht.

Erstellen Sie eine Tabelle namens top_albums, die jede dieser Spalten enthält, indem Sie den folgenden CREATE TABLE-Befehl ausführen:

CREATE TABLE top_albums (
music_id int, 
artist_name varchar(30),
album_name varchar(30), 
release_date DATE,
genre_type varchar(25),
copies_sold decimal(4,1),
PRIMARY KEY (music_id)
); 

Fügen Sie als nächstes einige Beispieldaten in die leere Tabelle ein:

INSERT INTO top_albums
(music_id, artist_name, album_name, release_date, genre_type, copies_sold)
VALUES
(1, 'Michael Jackson', 'Thriller', '1982-11-30', 'Pop', 49.2),
(2, 'Eagles', 'Hotel California', '1976-12-08', 'Soft Rock', 31.5),
(3, 'Pink Floyd', 'The Dark Side of the Moon', '1973-03-01', 'Progressive Rock', 21.7),
(4, 'Shania Twain', 'Come On Over', '1997-11-04', 'Country', 29.6),
(5, 'AC/DC', 'Back in Black', '1980-07-25', 'Hard Rock', 29.5),
(6, 'Whitney Houston', 'The Bodyguard', '1992-11-25', 'R&B', 32.4),
(7, 'Fleetwood Mac', 'Rumours', '1977-02-04', 'Soft Rock', 27.9),
(8, 'Meat Loaf', 'Bat Out of Hell', '1977-10-11', 'Hard Rock', 21.7),
(9, 'Eagles', 'Their Greatest Hits 1971-1975', '1976-02-17', 'Country Rock', 41.2),
(10, 'Bee Gees', 'Saturday Night Fever', '1977-11-15', 'Disco', 21.6);

Ausgabe
Query OK, 10 rows affected (0.01 sec)
Records: 10 Duplicates: 0 Warnings: 0

Sobald Sie die Daten eingefügt haben, können Sie mit der Verwendung von CASE-Ausdrücken in SQL beginnen.

Verständnis der Syntax für CASE-Ausdrücke in SQL

CASE-Ausdrücke in SQL ermöglichen es Ihnen, Bedingungen für Ihre Daten festzulegen und eine ähnliche Logik wie bei if-then-Anweisungen anzuwenden, um Ihre Daten zu durchsuchen, die Werte zu vergleichen und zu prüfen, ob sie den von Ihnen festgelegten Bedingungen als „wahr“ entsprechen. Hier ist ein Beispiel für die allgemeine Syntax eines CASE-Ausdrucks:

CASE-Ausdruckssyntax

CASE 
    WHEN condition_1 THEN outcome_1
    WHEN condition_2 THEN outcome_2
    WHEN condition_3 THEN outcome_3
    ELSE else_outcome
END

Abhängig davon, wie viele Bedingungen Sie für Ihre Daten festlegen möchten, enthalten CASE-Ausdrücke in SQL die folgenden Schlüsselwörter:

  • WHEN: Dieses Schlüsselwort bewertet und vergleicht die in Ihrer Tabelle vorhandenen Datenwerte mit den von Ihnen festgelegten Bedingungen oder Kriterien. WHEN ist vergleichbar mit if in einer typischen if-then-else-Anweisung.
  • THEN: Dieses Schlüsselwort filtert durch jede Bedingung, die Sie möglicherweise festgelegt haben, wenn ein bestimmter Wert nicht den Kriterien entspricht.
  • ELSE: Wenn der Datenwert nach Durchlaufen aller WHEN- und THEN-Anweisungen keine der von Ihnen festgelegten Bedingungen erfüllt, kann dieses Schlüsselwort verwendet werden, um die endgültige Bedingung festzulegen, unter der es kategorisiert werden kann.
  • END: Um den CASE-Ausdruck erfolgreich auszuführen und Ihre Bedingungen festzulegen, müssen Sie mit dem END-Schlüsselwort enden.

Mit diesem Verständnis der CASE-Ausdrucksstruktur und -syntax können Sie nun mit den Beispieldaten üben.

Verwendung von CASE-Ausdrücken in SQL

Stellen Sie sich vor, Sie sind ein DJ, der eine Playlist für die 65. Geburtstagsfeier Ihrer exzentrischen Tante Carol vorbereitet. Da ihr Musikgeschmack schwer einzuordnen ist, beschließen Sie, ein wenig zu recherchieren und die zehn meistverkauften Alben aller Zeiten zu untersuchen, um Ihre musikalischen Entscheidungen zu treffen.

Überprüfen Sie zunächst die Liste, die Sie in der Tabelle „top_albums“ zusammengestellt haben, indem Sie SELECT und das *-Symbol verwenden, um alle Daten aus jeder Spalte anzuzeigen:

Ausgabe

+----------+-----------------+-------------------------------+--------------+------------------+-------------+
| music_id | artist_name     | album_name                    | release_date | genre_type       | copies_sold |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
|        1 | Michael Jackson | Thriller                      | 1982-11-30   | Pop              |        49.2 |
|        2 | Eagles          | Hotel California              | 1976-12-08   | Soft Rock        |        31.5 |
|        3 | Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Progressive Rock |        21.7 |
|        4 | Shania Twain    | Come On Over                  | 1997-11-04   | Country          |        29.6 |
|        5 | AC/DC           | Back in Black                 | 1980-07-25   | Hard Rock        |        29.5 |
|        6 | Whitney Houston | The Bodyguard                 | 1992-11-25   | R&B              |        32.4 |
|        7 | Fleetwood Mac   | Rumours                       | 1977-02-04   | Soft Rock        |        27.9 |
|        8 | Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Hard Rock        |        21.7 |
|        9 | Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Country Rock     |        41.2 |
|       10 | Bee Gees        | Saturday Night Fever          | 1977-11-15   | Disco            |        21.6 |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
10 rows in set (0.00 sec)

Da Tante Carol 1957 geboren wurde, genoss sie viele Hits aus den siebziger und achtziger Jahren in ihrer Jugend. Sie ist ein großer Fan von Pop, Soft Rock und Disco, daher möchten Sie diese auf Ihrer Playlist als höchste Priorität einordnen.

Dies können Sie tun, indem Sie den CASE-Ausdruck verwenden, um eine Bedingung für „High Priority“ für diese bestimmten Genres festzulegen, indem Sie nach diesen Datenwerten in der Spalte genre_type suchen. Die folgende Abfrage erstellt eine Alias-Spalte für das Ergebnis des CASE-Ausdrucks und nennt sie „priority“. Diese Abfrage umfasst auch artist_name, album_name und release_date zur besseren Kontextualisierung. Vergessen Sie nicht, das END-Schlüsselwort zu verwenden, um den vollständigen CASE-Ausdruck abzuschließen:

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Pop' THEN 'High Priority' 
WHEN genre_type = 'Soft Rock' THEN 'High Priority'
WHEN genre_type = 'Disco' THEN 'High Priority'
END AS priority
FROM top_albums;

Ausgabe

+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | priority      |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | NULL          |
| Shania Twain    | Come On Over                  | 1997-11-04   | NULL          |
| AC/DC           | Back in Black                 | 1980-07-25   | NULL          |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | NULL          |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | NULL          |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | NULL          |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

Obwohl diese Ausgabe die von Ihnen festgelegten Bedingungen für diese Genres mit hoher Priorität widerspiegelt, führt das Fehlen des ELSE-Schlüsselworts zu unbekannten oder fehlenden Datenwerten, die als NULL-Werte bekannt sind. Während das ELSE-Schlüsselwort nicht erforderlich ist, wenn Ihre Datenwerte alle festgelegten Bedingungen erfüllen, ist es für alle verbleibenden Daten nützlich, damit sie ordnungsgemäß unter einer einzigen Bedingung kategorisiert werden können.

Schreiben Sie für die nächste Abfrage denselben CASE-Ausdruck, fügen Sie jedoch diesmal eine Bedingung mit dem ELSE-Schlüsselwort hinzu. Im folgenden Beispiel kennzeichnet das ELSE-Argument alle nicht hochpriorisierten Datenwerte für genre_type als „Maybe“:

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Pop' THEN 'High Priority' 
WHEN genre_type = 'Soft Rock' THEN 'High Priority'
WHEN genre_type = 'Disco' THEN 'High Priority'
ELSE 'Maybe'
END AS priority
FROM top_albums;

Ausgabe

+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | priority      |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Maybe         |
| Shania Twain    | Come On Over                  | 1997-11-04   | Maybe         |
| AC/DC           | Back in Black                 | 1980-07-25   | Maybe         |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | Maybe         |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Maybe         |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Maybe         |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

Dieses Ergebnis ist nun viel repräsentativer für die von Ihnen festgelegten Bedingungen, die Alben mit der höchsten Priorität und die ohne. Auch wenn dies die vier wichtigsten Alben – Thriller, Hotel California, Rumours und Saturday Night Fever – priorisiert, sind Sie davon überzeugt, dass die Playlist abwechslungsreicher sein muss. Aber auch Ihre Tante Carol müssen Sie davon überzeugen.

Sie beschließen, ein kleines Experiment durchzuführen, und bitten Tante Carol, ihren musikalischen Horizont zu erweitern und die restlichen Alben anzuhören. Sie geben ihr keine zusätzlichen Informationen zu den Alben und bitten sie, diese ehrlich mit „Mellow“, „Fun“ oder „Boring“ zu bewerten. Nachdem sie fertig ist, gibt sie Ihnen eine handgeschriebene Liste mit ihren Bewertungen. Jetzt haben Sie die Informationen, die Sie benötigen, um die Bedingungen für Ihre Abfrage wie folgt festzulegen:

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Hard Rock' THEN 'Boring' 
WHEN genre_type = 'Country Rock' THEN 'Mellow'
WHEN genre_type = 'Progressive Rock' THEN 'Fun'
WHEN genre_type = 'Country' THEN 'Fun'
WHEN genre_type = 'R&B' THEN 'Boring'
ELSE 'High Priority' 
END AS score
FROM top_albums;

Ausgabe

+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | score         |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Fun           |
| Shania Twain    | Come On Over                  | 1997-11-04   | Fun           |
| AC/DC           | Back in Black                 | 1980-07-25   | Boring        |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | Boring        |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Boring        |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Mellow        |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

Anhand dieser Ausgabe scheint Tante Carol offen für neue Klänge zu sein, und Sie sind angenehm überrascht über ihre Bewertung für Pink Floyd. Ein wenig enttäuscht sind Sie allerdings über ihr mangelndes Interesse an den großartigen Stücken von AC/DC, Meat Loaf und Whitney Houston.

Tante Carol könnte flexibler sein, wenn Sie ihr zeigen könnten, dass einige Alben objektiv beliebter sind als andere. Daher entscheiden Sie sich, einige Zahlen heranzuziehen, um die Entscheidung zu beeinflussen. Tatsache ist, dass dies die zehn besten Alben sind, weil sie über Jahrzehnte hinweg Millionen von Exemplaren an Fans verkauft haben. Daher erstellen Sie für die nächste Abfrage einen neuen CASE-Ausdruck. Dieser basiert auf der numerischen Datenmenge von „copies_sold“ der bisher verkauften Alben.

Sie verwenden den CASE-Ausdruck, um Bedingungen für Alben mit mindestens 35 Millionen verkauften Exemplaren als „best“, für 25 Millionen als „great“, für 20 Millionen als „good“ und alles darunter als „mediocre“ festzulegen, wie im folgenden Beispiel:

SELECT artist_name, album_name, release_date, CASE WHEN copies_sold >35.0 THEN 'best'
WHEN copies_sold >25.0 THEN 'great'
WHEN copies_sold >20.0 THEN 'good'
ELSE 'mediocre' END AS score FROM top_albums;

Ausgabe

+-----------------+-------------------------------+--------------+-------+
| artist_name     | album_name                    | release_date | score |
+-----------------+-------------------------------+--------------+-------+
| Michael Jackson | Thriller                      | 1982-11-30   | best  |
| Eagles          | Hotel California              | 1976-12-08   | great |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | good  |
| Shania Twain    | Come On Over                  | 1997-11-04   | great |
| AC/DC           | Back in Black                 | 1980-07-25   | great |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | great |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | great |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | good  |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | best  |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | good  |
+-----------------+-------------------------------+--------------+-------+
10 rows in set (0.00 sec)

Anhand dieser Ausgabe wurde kein Album als „mediocre“ bewertet, da alle mehr als 20 Millionen Exemplare verkauft haben. Einige Alben heben sich jedoch von den anderen ab, basierend auf den Bewertungen. Jetzt können Sie Ihrer Tante Carol beweisen, dass AC/DC und Whitney Houston mit über 25 Millionen verkauften Alben Klassiker sind.

Jetzt verstehen Sie, wie Sie den CASE-Ausdruck verwenden, um Bedingungen für verschiedene Zwecke und mit Zeichen- und numerischen Datentypen festzulegen. Außerdem, wie CASE die if-then-Logik verwendet, um diese Werte zu vergleichen und die Antworten basierend auf den gewünschten Bedingungen zu generieren.

Fazit zu CASE-Ausdrücke in SQL

Zu verstehen, wie man den CASE-Ausdruck verwendet, kann Ihnen helfen, Ihre Daten auf die gewünschten Bedingungen einzugrenzen. Egal, ob Sie verschiedene Prioritäten für bestimmte Werte festlegen oder sie anhand von Kriterien wie Meinungen oder Zahlen bewerten möchten, der CASE-Ausdruck ist flexibel einsetzbar. Lesen Sie unseren Leitfaden zu CAST-Funktionen und Verkettungsausdrücken, um Datenwerte in Ergebnismengen zu manipulieren, um mehr zu erfahren.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren:

centron Managed Cloud Hosting in Deutschland

So reparieren Sie beschädigte Tabellen in MySQL

MySQL, Tutorial
Reparatur von beschädigten MySQL-Tabellen Gelegentlich können MySQL-Tabellen beschädigt werden, was bedeutet, dass ein Fehler aufgetreten ist und die darin enthaltenen Daten nicht mehr lesbar sind. Versuche, auf eine beschädigte Tabelle…
centron Managed Cloud Hosting in Deutschland

Hibernate Tomcat JNDI DataSource Beispiel-Tutorial

MySQL, Tutorial
Hibernate Tomcat JNDI DataSource Beispiel-Tutorial Wir haben bereits gesehen, wie man das Hibernate ORM-Tool in einer eigenständigen Java-Anwendung verwendet. Heute lernen wir, wie man Hibernate mit einer DataSource im Tomcat-Servlet-Container…