MySQL ストアド プロシージャで case ステートメントを使用する詳細な例

MySQL ストアド プロシージャで case ステートメントを使用する詳細な例

この記事では、例を使用して、MySQL ストアド プロシージャでの case ステートメントの使用方法を説明します。ご参考までに、詳細は以下の通りです。

if ステートメントに加えて、MySQL では代替の条件ステートメント CASE も提供されます。 MySQL の CASE ステートメントにより、コードの可読性と効率性が向上します。では、これ以上長々とせずに、簡単な case ステートメントの構文を見てみましょう。

CASE ケース式
  WHEN when_expression_1 THEN コマンド
  WHEN when_expression_2 THEN コマンド
  ...
  ELSEコマンド
ケース終了;

単純な CASE ステートメントを使用して、式の値が一意の値のセットと一致するかどうかを確認できます。上記の SQL では、case_expression は任意の有効な式にすることができます。 when_expression_1、when_expression_2 など、各 WHEN 句の when_expression と case_expression の値を比較します。 case_expression と when_expression_n の値が等しい場合、対応する WHEN ブランチのコマンドが実行されます。 WHEN 句の when_expression が case_expression の値と一致する場合、ELSE 句のコマンドが実行されます。 ELSE 句はオプションです。ELSE 句を省略して一致するものが見つからない場合、MySQL はエラーを発生させます。簡単な CASE ステートメントを使用した例を見てみましょう。

区切り文字 $$
プロシージャ GetCustomerShipping( を作成する
 p_customerNumber int(11)では、 
 出力 p_shiping varchar(50))
始める
  customerCountry varchar(50) を宣言します。
  国を顧客国に選択
 お客様から
 ここで、顧客番号 = p_顧客番号;
  CASE 顧客国
 「アメリカ」が
  SET p_shiping = '2日配送';
 「カナダ」が
  SET p_shiping = '3日配送';
 それ以外
  SET p_shiping = '5日配送';
 ケース終了;
終わり$$

上記のSQLは次のように動作します:

  • GetCustomerShipping ストアド プロシージャは、顧客番号を IN パラメーターとして受け入れ、顧客の国に基づいて発送時間を返します。
  • ストアド プロシージャでは、まず、入力された顧客番号に基づいて顧客の国を取得します。次に、単純な CASE ステートメントを使用して顧客の国を比較し、発送期間を決定します。顧客が米国(USA)に所在する場合、配達期間は2日です。 顧客がカナダにお住まいの場合、配達期間は 3 日です。 その他の国からのお客様は発送に5日かかります。

配送時間を決定するロジックのフローチャートを見てみましょう。

以下は、上記のストアド プロシージャのテスト スクリプトです。

@顧客番号を 112 に設定します。
国を@countryに選択する
お客様から
ここで、顧客番号 = @顧客番号;
GetCustomerShipping(@customerNo,@shipping) を呼び出します。
@customerNo を顧客として選択します。
    @country 国として、
    @shipping AS 配送;

上記のコードを実行すると、次の結果が得られます。

+----------+----------+----------------+
| 顧客 | 国 | 配送 |
+----------+----------+----------------+
| 112 | 米国 | 2日以内発送 |
+----------+----------+----------------+
セット内の1行

単純な CASE ステートメントを使用すると、式の値をさまざまな値のセットと照合することができます。 範囲などのより複雑な一致を実行するには、検索可能な CASE ステートメントを使用できます。 検索可能な CASE ステートメントは IF ステートメントと同等ですが、その構造はより読みやすくなっています。その文法構造を見てみましょう。

場合
  WHEN condition_1 THEN コマンド
  WHEN condition_2 THEN コマンド
  ...
  ELSEコマンド
ケース終了;

上記の SQL は、値が TRUE の条件が見つかるまで、まず WHEN 句の各条件を評価し、次に THEN 句の対応するコマンドを実行します。いずれの条件も TRUE でない場合は、ELSE 句内のコマンドが実行されます。 ELSE 句を指定せず、いずれの条件も TRUE と評価されない場合、MySQL はエラー メッセージを発行します。 MySQL では、THEN 句または ELSE 句で空のコマンドは許可されません。 ELSE 句のロジックを処理したくないと同時に、mysql がエラーをスローしないようにするには、ELSE 句に空の BEGIN END ブロックを配置します。検索可能な CASE ステートメントを使用して、SILVER、GOLD、または PLATINUM のクレジット限度額を持つ顧客を検索する例を見てみましょう。

区切り文字 $$
CREATE PROCEDURE GetCustomerLevel(
 p_customerNumber int(11)では、 
 出力 p_customerLevel varchar(10))
始める
  creditlim double を宣言します。
  クレジット制限をクレジット制限に選択する
 お客様から
 ここで、顧客番号 = p_顧客番号;
  場合 
 クレジット限度額が50000を超える場合 
  p_customerLevel を 'PLATINUM' に設定します。
 (creditlim <= 50000 かつ creditlim >= 10000) の場合
  p_customerLevel を 'GOLD' に設定します。
 クレジット限度額が10000未満の場合は
  p_customerLevel を 'SILVER' に設定します。
 ケース終了;
終わり$$

上記のクエリ ロジックでは、クレジット限度額は次のようになります。

  • 50K を超える場合、顧客は PLATINUM 顧客です。
  • 50K 未満で 10K を超える場合、顧客は GOLD 顧客です。
  • 10K 未満の場合、顧客は SILVER 顧客です。

次のテスト スクリプトを実行してストアド プロシージャをテストできます。

GetCustomerLevel(112,@level) を呼び出します。
SELECT @level AS '顧客レベル';

上記のクエリステートメントを実行すると、次の結果が得られます。

+----------------+
| 顧客レベル |
+----------------+
| プラチナ |
+----------------+
セット内の1行

さて、今回の共有はこれですべてです。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL ストアド プロシージャ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQLの場合の使用例分析
  • MySQLソートにおけるCASE WHENの使用例
  • MySQL における識別子の大文字と小文字の区別の問題の詳細な分析
  • MySQL のグループ分けの例
  • Mysql のケースと使用方法の詳細な説明
  • mysql 更新ケース更新フィールド値が固定されていない操作

<<:  Ajax の JavaScript ソリューションにおける parsererror エラー ケースの詳細な説明

>>:  Ubuntu 18.04 で apt-get ソースを変更する方法

推薦する

ウェブページ制作と饅頭の関係(体験の共有)

昨日は遅くまで寝ていて、一日中起きていました。私の年齢では、夜更かしして本を書くのはもう無理のようで...

強くお勧めします! Vue 3.2 でシンタックスシュガーを設定する

目次前の1. セットアップ構文シュガーとは何か2. セットアップコンポーネントを使用して自動的に登録...

Dockerサーバーのストレージリソースプール不足問題の解決

目次1. 問題の説明2. 問題分析3. 問題解決1. Dockerのディスク使用量を確認する2. 再...

フロントエンドセキュリティの詳細な説明: JavaScript の http ハイジャック対策と XSS

目次HTTP ハイジャック、DNS ハイジャック、XSS HTTPハイジャックDNSハイジャックXS...

現在のブラウザが JavaScript でヘッドレス ブラウザであるかどうかを検出する方法

目次ヘッドレスブラウザとは何ですか?なぜ「ヘッドレス」ブラウザと呼ばれるのでしょうか?ヘッドレスブラ...

CSS変換ページめくりアニメーションレコードの実装

ページめくりの問題のシナリオBとCは同じページ(表と裏)にありますページをめくって A をカバーした...

Docker を使用して MySQL および Redis サービスをデプロイする方法

目次Dockerを使用してMySQLサービスをデプロイする方法DockerでRedisサービスをデプ...

MySQL エラー: ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションの解決策を再起動してください

問題を見つける最近、以前のデータを入力していたときに、プログラムが突然次のエラーを報告しました。 [...

MySQL FAQ シリーズ: 一時テーブルを使用する場合

一時テーブルの概要一時テーブルとは: MySQL は中間結果セットを保存するために使用されます。一時...

Typora コードブロックのカラーマッチングとタイトルシリアル番号実装コード

効果: タイトルには独自のシリアル番号があり、コードブロックには配色があり、コードブロックの左上隅に...

CSS で 2 つの固定列と 1 つの適応列を実装するいくつかの方法

この記事では、CSS で 2 つの固定列と 1 つのアダプティブ列を実装するいくつかの方法を紹介し、...

非常に詳細な基本的なJavaScript構文ルール

目次01 JavaScript(略称:js) js は 3 つの部分に分かれています。 JavaSc...

Vue ターンテーブル抽選の簡単な実装

この記事では、ホイール抽選を簡単に実装するためのVueの具体的なコードを参考までに共有します。具体的...

jsネイティブカルーセルプラグインの制作

この記事では、jsネイティブカルーセルプラグインの具体的なコードを参考までに共有します。具体的な内容...

SSHトンネルを使用してMySQLサーバーに接続する方法

序文場合によっては、データベースのイントラネット アドレスしか知らず、イントラネット経由で接続できな...