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

Implementierung von Linux-Dateisystemvorgängen

In dieser Lesenotiz werden hauptsächlich die Vorg...

Ein Artikel zeigt Ihnen, wie Sie mit React ein Rezeptsystem implementieren

Inhaltsverzeichnis 1. Rezeptsammlung 1.1 Projekth...

Detaillierte Erklärung der CSS-Stylesheets und des Formatlayouts

Stilvorlagen CSS (Cascading Style Sheets) wird zu...

So entfernen Sie „Enter“, „Senden“ und „Enter != Senden“ aus dem Formular

Um das Problem „Eingeben != Absenden“ zu implement...

JavaScript implementiert einfache Rechnerfunktion

In diesem Artikelbeispiel wird der spezifische Ja...

Spezifische Verwendung von Vues neuem Spielzeug VueUse

Inhaltsverzeichnis Vorwort Was ist VueUse Einfach...

Asynchroner Lebenszyklus von AsyncHooks in Node8

Async Hooks ist eine neue Funktion von Node8. Sie...

So erhalten Sie USB-Scannerdaten mit js

In diesem Artikel wird der spezifische Prozess zu...

W3C Tutorial (7): W3C XSL Aktivitäten

Ein Stylesheet beschreibt, wie ein Dokument angez...

Detaillierte Erklärung zu Drag-Time und Drag-Case in JavaScript

Inhaltsverzeichnis DragEvent-Schnittstelle Übersi...

Detaillierte Analyse des Linux-Kernel-Makros container_of

1. Wie oben erwähnt Ich habe dieses Makro gesehen...

Detaillierte Erklärung zur Verwendung der Linux-lseek-Funktion

Hinweis: Wenn der Artikel Fehler enthält, hinterl...

mysql5.6.zip-Format komprimierte Version Installations-Grafik-Tutorial

Vorwort: MySQL ist ein relationales Datenbankverw...