Detailliertes Beispiel für die Verwendung der Case-Anweisung in einer gespeicherten MySQL-Prozedur

Detailliertes Beispiel für die Verwendung der Case-Anweisung in einer gespeicherten MySQL-Prozedur

Dieser Artikel veranschaulicht anhand eines Beispiels die Verwendung der Case-Anweisung in gespeicherten MySQL-Prozeduren. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Zusätzlich zur if-Anweisung bietet MySQL eine alternative bedingte Anweisung CASE. Die CASE-Anweisung von MySQL macht den Code lesbarer und effizienter. Schauen wir uns ohne weitere Umschweife die Syntax einer einfachen Case-Anweisung an:

CASE Fallausdruck
  WANN when_expression_1 DANN Befehle
  WANN when_expression_2 DANN Befehle
  ...
  ELSE-Befehle
FALLENDE;

Wir können eine einfache CASE-Anweisung verwenden, um zu prüfen, ob der Wert eines Ausdrucks mit einer Reihe eindeutiger Werte übereinstimmt. Im obigen SQL kann case_expression jeder gültige Ausdruck sein. Wir vergleichen den Wert von case_expression mit dem when_expression in jeder WHEN-Klausel, beispielsweise when_expression_1, when_expression_2 usw. Wenn die Werte von case_expression und when_expression_n gleich sind, werden die Befehle im entsprechenden WHEN-Zweig ausgeführt. Wenn der when_expression in der WHEN-Klausel mit dem Wert des case_expression übereinstimmt, werden die Befehle in der ELSE-Klausel ausgeführt. Die ELSE-Klausel ist optional. Wenn wir die ELSE-Klausel weglassen und keine Übereinstimmung gefunden wird, gibt MySQL einen Fehler aus. Sehen wir uns ein Beispiel mit einer einfachen CASE-Anweisung an:

TRENNUNGSZEICHEN $$
PROZEDUR ERSTELLEN GetCustomerShipping(
 in p_customerNumber int(11), 
 out p_shiping varchar(50))
BEGINNEN
  DECLARE KundeLand varchar(50);
  Wählen Sie Land in Kundenland aus.
 VON Kunden
 WO Kundennummer = p_Kundennummer;
  CASE KundeLand
 WENN 'USA' DANN
  SET p_shiping = '2-Tage-Versand';
 WENN 'KANADA' DANN
  SET p_shiping = '3-Tage-Versand';
 ANDERS
  SET p_shiping = '5-Tage-Versand';
 FALLENDE;
ENDE$$

Das obige SQL funktioniert folgendermaßen:

  • Die gespeicherte Prozedur GetCustomerShipping akzeptiert eine Kundennummer als IN-Parameter und gibt die Lieferzeit basierend auf dem Land des Kunden zurück.
  • In der gespeicherten Prozedur ermitteln wir zunächst das Land des Kunden basierend auf der eingegebenen Kundennummer. Anschließend wird mittels einer einfachen CASE-Anweisung das Land des Kunden abgeglichen, um den Versandzeitraum zu ermitteln. Befindet sich der Kunde in den Vereinigten Staaten (USA), beträgt die Lieferzeit 2 Tage. Wenn sich der Kunde in Kanada befindet, beträgt die Lieferzeit 3 ​​Tage. Kunden aus anderen Ländern benötigen 5 Tage Lieferzeit.

Schauen wir uns das Flussdiagramm der Logik zur Bestimmung des Versandzeitpunkts an:

Das Folgende ist das Testskript für die oben gespeicherte Prozedur:

SET @Kundennummer = 112;
Wählen Sie Land in @country aus
VON Kunden
WO Kundennummer = @Kundennr;
Rufen Sie GetCustomerShipping (@Kundennummer, @Versand) auf.
Wählen Sie @customerNo AS Kunde,
    @country ALS Land,
    @Versand als Versand;

Führen Sie den obigen Code aus und erhalten Sie die folgenden Ergebnisse:

+----------+----------+----------------+
| Kunde | Land | Versand |
+----------+----------+----------------+
| 112 | USA | 2-tägiger Versand |
+----------+----------+----------------+
1 Reihe im Set

Mit der einfachen CASE-Anweisung können wir den Wert eines Ausdrucks mit einer Reihe unterschiedlicher Werte abgleichen. Um komplexere Übereinstimmungen, wie etwa Bereiche, durchzuführen, können wir eine durchsuchbare CASE-Anweisung verwenden. Die durchsuchbare CASE-Anweisung entspricht der IF-Anweisung, ist aber lesbarer aufgebaut. Werfen wir einen Blick auf die grammatische Struktur:

FALL
  Wenn Bedingung_1, dann Befehle
  Wenn Bedingung_2, dann Befehle
  ...
  ELSE-Befehle
FALLENDE;

Das obige SQL wertet zuerst jede Bedingung in der WHEN-Klausel aus, bis eine Bedingung mit dem Wert TRUE gefunden wird, und führt dann die entsprechenden Befehle in der THEN-Klausel aus. Wenn keine der Bedingungen WAHR ist, werden die Befehle in der ELSE-Klausel ausgeführt. Wenn Sie keine ELSE-Klausel angeben und keine der Bedingungen als TRUE ausgewertet wird, gibt MySQL eine Fehlermeldung aus. MySQL erlaubt keinen leeren Befehl in einer THEN- oder ELSE-Klausel. Wenn wir die Logik in der ELSE-Klausel nicht verarbeiten und gleichzeitig verhindern möchten, dass MySQL einen Fehler ausgibt, können wir einen leeren BEGIN END-Block in die ELSE-Klausel einfügen. Sehen wir uns ein Beispiel für die Verwendung einer durchsuchbaren CASE-Anweisung an, um Kunden mit dem Kreditlimit SILBER, GOLD oder PLATIN zu finden:

TRENNUNGSZEICHEN $$
PROZEDUR ERSTELLEN GetCustomerLevel(
 in p_customerNumber int(11), 
 aus p_customerLevel varchar(10))
BEGINNEN
  DECLARE Kreditlim doppelt;
  SELECT Kreditlimit INTO Kreditlimit
 VON Kunden
 WO Kundennummer = p_Kundennummer;
  FALL 
 WENN creditlim > 50000 DANN 
  SETZEN Sie p_customerLevel = "PLATINUM";
 WENN (creditlim <= 50000 UND creditlim >= 10000) DANN
  SET p_customerLevel = 'GOLD';
 WENN Kreditlimit < 10000 DANN
  SET p_customerLevel = 'SILBER';
 FALLENDE;
ENDE$$

Wenn in der obigen Abfragelogik das Kreditlimit beträgt:

  • Liegt der Wert über 50.000, ist der Kunde ein PLATINUM-Kunde.
  • Bei weniger als 50.000 und mehr als 10.000 ist der Kunde ein GOLD-Kunde.
  • Wenn der Betrag unter 10.000 liegt, ist der Kunde ein SILBER-Kunde.

Wir können die gespeicherte Prozedur testen, indem wir das folgende Testskript ausführen:

Rufen Sie GetCustomerLevel(112,@level) auf;
SELECT @level AS 'Kundenebene';

Führen Sie die obige Abfrageanweisung aus und erhalten Sie die folgenden Ergebnisse:

+----------------+
| Kundenebene |
+----------------+
| PLATIN |
+----------------+
1 Reihe im Set

Okay, das ist alles zu diesem Teilen.

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „Kenntnisse zu gespeicherten MySQL-Prozeduren“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „Kenntnisse zu MySQL-Protokollvorgängen“, „Zusammenfassung der Kenntnisse zu MySQL-Transaktionsvorgängen“ und „Zusammenfassung der Kenntnisse zu MySQL-Datenbanksperren“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • MySQL-Fall bei der Verwendungsbeispielanalyse
  • Beispiel für die Verwendung von CASE WHEN beim Sortieren in MySQL
  • Detaillierte Analyse des Problems der Groß-/Kleinschreibung von Bezeichnern in MySQL
  • MySQL-Fall beim Gruppieren nach Beispiel
  • Detaillierte Erklärung des Mysql-Falls und der Verwendung
  • MySQL-Update-Fall Update-Feldwert ist keine feste Operation

<<:  Detaillierte Erklärung des Parsererror-Fehlerfalls in der JavaScript-Lösung in Ajax

>>:  So ändern Sie die Apt-Get-Quelle in Ubuntu 18.04

Artikel empfehlen

JavaScript implementiert einfache Datumseffekte

Der spezifische Code der JavaScript-Datumseffekte...

Ausführliche Erläuterung zum MySQL-Lernen einer Datenbanksicherung

Inhaltsverzeichnis 1.DB, DBMS, SQL 2. Eigenschaft...

Designtheorie: Menschenorientiertes Designkonzept

<br />Als sich das Denken in Ost und West sp...

4 Möglichkeiten zum Ändern des MySQL-Root-Passworts (Zusammenfassung)

Methode 1: Verwenden Sie den Befehl SET PASSWORD ...

HTML-Code einer Webseite: Erzeugung von Lauftext

In diesem Abschnitt beschreibt der Autor die spez...

Detaillierte Erklärung des Befehls mkdir beim Linux-Lernen

Inhaltsverzeichnis Vorwort 1. Grundkenntnisse zu ...

Details nach dem Setzen des src des Iframes auf about:blank

Nachdem die Quelle des Iframes auf „about:blank“ g...

Lösen Sie das Problem ungültiger UTF8-Einstellungen in MySQL 5.6

Nach der Dekomprimierung der grünen Version von m...