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

Erläuterung synthetischer React-Ereignisse

Inhaltsverzeichnis Klicken Sie zunächst auf das E...

Der Unterschied zwischen Hash-Modus und Verlaufsmodus im Vue-Router

vue-router hat zwei Modi Hash-Modus Verlaufsmodus...

Implementierung einer zirkulären Scroll-Listenfunktion basierend auf Vue

Hinweis: Sie müssen dem übergeordneten Container ...

Die 10 klassischen Optimierungsfälle und -szenarien von MySQL

Inhaltsverzeichnis 1. Allgemeine Schritte zur SQL...

Überlegungen zum Rasterdesign von Webseiten

<br />Ursprüngliche Adresse: http://andymao....

MYSQL Performance Analyzer EXPLAIN Anwendungsbeispielanalyse

Dieser Artikel veranschaulicht anhand eines Beisp...

Binäre Typoperationen in MySQL

Dieser Artikel stellt hauptsächlich die binären O...

jQuery erzielt einen atmenden Karusselleffekt

In diesem Artikel wird der spezifische Code von j...

So fixieren Sie Inhalte beim Scrollen einer HTML-Seite an einer festen Position

In diesem Artikel wird hauptsächlich erläutert, w...

Die Bedeutung des Statuscodes im HTTP-Protokoll

Ein Statuscode, der eine vorläufige Antwort anzei...