Navicat 部落格

在 WHERE 子句中使用 CASE 陳述式 2020 年 6 月 23 日,由 Robert Gravelle 撰寫

不久前,我們介紹了非常有用且用途廣泛的 CASE 陳述式。在那篇文章中,我們像大多數 DBA 和開發員一樣,在 SELECT 子句中使用 CASE 陳述式。另一種方法是在 WHERE 子句中使用。在那裡,可以利用它根據條件來變更查詢取得的資料。在這種情況下,CASE 陳述式非常適合靜態查詢和動態查詢,例如在儲存程序中的查詢。在今天的文章中,我們將在 Navicat Premium 中建立一個 SELECT 查詢,該查詢將根據另一個欄位的值傳回列。

按租期列出電影

在使用 CASE 陳述式之前,讓我們從一個查詢開始,該查詢傳回 Sakila 範例資料庫中的電影清單。這是一個 MySQL 資料庫,其中包含與虛構的影片出租商店有關的資料表、檢視和查詢。資料表包括 actor、film、customer、rentals 等。

我們的查詢顯示電影ID、標題、租金和租期欄,並將欄位縮小至租期為 5 天的電影。這是陳述式:

SELECT film_id, title, rental_rate, rental_duration 
FROM film 
WHERE rental_duration = 5 
ORDER BY rental_rate DESC;

在 Navicat Premium 中執行查詢將顯示以下結果:

films_by_duration (106K)

根據租金設定租期

使用 CASE 陳述式可以根據其他幾個可能的值選擇一個值。例如,假設我們要根據 rental_rate 設定 rental_duration,可以這樣使用 CASE 陳述式來做到這一點:

SELECT film_id, title, rental_rate, rental_duration 
FROM film 
WHERE rental_duration = CASE rental_rate
	                        WHEN 0.99 THEN 3
	                        WHEN 2.99 THEN 4
	                        WHEN 4.99 THEN 5
	                        ELSE 6
                        END 
ORDER BY title DESC;

這陳述式有將 rental_rate 與 rental_duration 建立關聯的效果。因此:

  • 當 rental_rate 等於 0.99 時,僅包含 rental_duration 等於 3 的電影。
  • 當 rental_rate 等於 2.99 時,僅包含 rental_duration 等於 4 的電影。
  • 當 rental_rate 等於 4.99 時,僅包含 rental_duration 等於 5 的電影。
  • 任何其他 rental_rate 僅包含 rental_duration 等於 6 的電影。

我們可以在下面的螢幕擷取中看到查詢結果:

films_by_duration_using_case (145K)

請注意,每部租金為 0.99 的電影,其 rental_duration 始終為 3。同樣,租金為 2.99 的電影都具有 4 的 rental_duration,以此類推。

重寫 CASE 陳述式

請記住,CASE 陳述式僅是組合兩個或多個 OR 條件的替代方法。因此,我們可以不使用 CASE 陳述式來重寫查詢,但是,正如你所看到的那樣,這需要寫更多的 SQL:

SELECT film_id, title, rental_rate, rental_duration 
FROM film 
WHERE rental_rate = 0.99 AND rental_duration = 3
  OR rental_rate = 2.99 AND rental_duration = 4
  OR rental_rate = 4.99 AND rental_duration = 5
  OR rental_rate NOT IN (0.99, 2.99, 4.99) AND rental_duration = 6
ORDER BY title DESC;

這是查詢結果。將這結果與 CASE 查詢的結果比較:

films_by_duration_using_or (163K)

總結

在今天的文章中,我們在 Navicat Premium 中建立了一個 SELECT 查詢,該查詢使用 WHERE 子句中的 CASE 陳述式傳回電影清單。如果你對 Navicat Premium 感興趣,可以免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔