不久前,我們介紹了非常有用且用途廣泛的 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 中執行查詢將顯示以下結果:
根據租金設定租期
使用 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 的電影。
我們可以在下面的螢幕擷取中看到查詢結果:
請注意,每部租金為 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 查詢的結果比較:
總結
在今天的文章中,我們在 Navicat Premium 中建立了一個 SELECT 查詢,該查詢使用 WHERE 子句中的 CASE 陳述式傳回電影清單。如果你對 Navicat Premium 感興趣,可以免費試用 14 天!