CASE 是一個流程控制陳述式,它的作用與 IF-THEN-ELSE 陳述式非常相似,可根據資料選擇一個數值。CASE 陳述式會通過條件檢查,並在滿足第一個條件時傳回一個數值。因此,一旦條件為 True 時,CASE 陳述式將會停止,從而略過後面的子句,並傳回結果。正如我們在今天的文章中看到的那樣,它可以用來測試條件和離散值。
基本語法
CASE 陳述式有兩種形式:第一種評估一個或多個條件,並傳回第一個條件為 True 的結果。如果沒有條件為 True,則傳回 ELSE 後面的結果。如果沒有 ELSE 部分,則傳回 NULL:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
第二種 CASE 語法傳回第一個 value=compare_value 比較結果為 True 的結果。如果沒有比較結果為 True,則傳回 ELSE 後面的結果。如果沒有 ELSE 部分,則傳回 NULL:
CASE compare_value
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
例子
我們將在 Navicat Premium 中嘗試使用 CASE 陳述式撰寫一些針對 Sakila 範例資料庫的查詢。它是一個功能強大的資料庫開發和管理工具,可以同時連線到大部分受歡迎的資料庫,包括 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 資料庫。它還與許多雲端資料庫相容,例如 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud、Google Cloud 和 MongoDB Atlas。
語法 1
這個查詢選取一個電影標題以及它們的發行年份和租借價格的清單:
我們將加入一個欄,將租借價格分為三類:「discount」、「regular」和「premium」。價格範圍是:
- 低於 $2.99
- 介乎於 $2.99 至 $4.99 之間
- $4.99 或以上
為了幫助使用 CASE 陳述式,Navicat 提供了程式碼片段功能,你只需將程式碼片段拖放至 SQL 編輯器即可。雖然你可以建立自己的陳述式,但 Navicat 附帶了許多標準 SQL 陳述式,包括 DDL 和流程控制的陳述式。實際上,你可以在流程控制清單的頂部找到 CASE 陳述式:
將程式碼片段放入編輯器後,可編輯的部分會以色彩標示以便識別。你可以使用 Tab 鍵從一個可編輯項移動到下一個。
由於這些陳述式本質上是通用的,因此你可能需要稍微修改它以適合你的特定資料庫類型。這是 MySQL 的完整 CASE 陳述式和查詢:
語法 2
第二種 CASE 語法非常適合針對兩個或多個條件測試離散值。例如,我們可以使用它根據電影評級加入一個目標觀眾欄:
總結
在今天的文章中,我們學習了如何使用 SQL CASE 陳述式來選擇基於底層資料的值。範例 SQL 陳述式是用 Navicat Premium 撰寫的。它的自動完成程式碼和自訂的程式碼片段功能透過關鍵字建議和減少重複輸入相同的程式碼,令編碼更加快速。你可以免費試用 14 天進行評估。