一、CASE WHEN THEN END的語法及基本用法
SQL的CASE WHEN THEN END功能是一種條件表達式,類似於其他編程語言中的switch語句。它能夠根據條件選擇不同的值或執行不同的操作。其基本語法結構如下:
SELECT column_name, CASE WHEN condition1 THEN expression1 WHEN condition2 THEN expression2 WHEN condition3 THEN expression3 ELSE expression4 END FROM table_name;
其中,condition是一個邏輯測試表達式,用來檢測某個列的值是否符合某個條件。如果符合,則返回對應的值expression;如果不符合,則繼續向下檢測下一個條件,直至最後一個ELSE,則返回對應的expression4。
比如下面的例子中,我們使用了CASE WHEN THEN END功能,根據訂單狀態的不同,返回不同的文本值:
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN 'The quantity is greater than 30' WHEN Quantity = 30 THEN 'The quantity is 30' ELSE 'The quantity is under 30' END AS QuantityText FROM OrderDetails;
該代碼會返回OrderDetails表中所有記錄的OrderID、Quantity及根據Quantity值返回相應的文本值的QuantityText列。
二、CASE WHEN THEN END的高級應用
除了基本語法外,CASE WHEN THEN END還有以下高級用法:
1. CASE WHEN THEN END用於聚合函數
當我們使用聚合函數(如SUM、AVG、COUNT等)時,有時需要返回不同的值或執行其他操作。這時可以使用CASE WHEN THEN END來實現。
以下是一個使用SUM函數和CASE WHEN THEN END的例子,返回某個客戶的訂單總金額及已支付金額:
SELECT CustomerID, SUM(CASE WHEN PaymentStatus = 'Paid' THEN OrderTotalAmount ELSE 0 END) AS PaidAmount, SUM(OrderTotalAmount) AS TotalAmount FROM Orders GROUP BY CustomerID;
該代碼會對Orders表中所有記錄按照CustomerID分組,返回每個客戶的訂單總金額和已支付金額(只計算已支付的訂單)。
2. CASE WHEN THEN END的多重用法
CASE WHEN THEN END不僅可以用於單個列的判斷,還可以用於多重判斷。以下是一個例子,它根據訂單時間的不同,給訂單標記不同的區間:
SELECT OrderID, OrderDate, CASE WHEN OrderDate BETWEEN '2018-01-01' AND '2018-03-31' THEN 'Q1' WHEN OrderDate BETWEEN '2018-04-01' AND '2018-06-30' THEN 'Q2' WHEN OrderDate BETWEEN '2018-07-01' AND '2018-09-30' THEN 'Q3' WHEN OrderDate BETWEEN '2018-10-01' AND '2018-12-31' THEN 'Q4' END AS Quarter FROM Orders;
該代碼會返回Orders表中所有記錄的OrderID、OrderDate及它們所屬的季度(Quarter)。如果訂單時間在某一季度內,那麼Quarter列就會返回相應的Q1、Q2等文本值。
三、常見問題及解決方法
1. CASE WHEN THEN END對NULL的處理
在使用CASE WHEN THEN END時,需要注意對NULL值的處理。如果條件中包含NULL,那麼可能會出現無法判斷的情況。下面是一個例子:
SELECT OrderID, Quantity, CASE WHEN Quantity IS NULL THEN 'The quantity is NULL' WHEN Quantity > 30 THEN 'The quantity is greater than 30' WHEN Quantity = 30 THEN 'The quantity is 30' ELSE 'The quantity is under 30' END AS QuantityText FROM OrderDetails;
如果Quantity列中存在NULL值,那麼以上代碼會返回QuantityText為NULL的記錄。為避免上述問題,建議在條件語句中使用IS NULL或IS NOT NULL來判斷NULL值。
2. CASE WHEN THEN END的性能問題
CASE WHEN THEN END功能在小數據集下使用無太大問題,但在大數據集下會影響性能。如果需要處理大數據集,建議儘可能使用其他優化方法,如使用JOIN。
四、使用實例
1. 使用CASE WHEN THEN END查詢用戶的會員等級
SELECT UserID, CASE WHEN SUM(OrderAmount) >= 1000 THEN '鉑金會員' WHEN SUM(OrderAmount) >= 500 THEN '黃金會員' WHEN SUM(OrderAmount) >= 100 THEN '白銀會員' ELSE '普通用戶' END AS MemberLevel FROM Orders GROUP BY UserID;
以上代碼會返回Orders表中每個用戶的會員等級,根據該用戶的總訂單金額來判斷。
2. 使用CASE WHEN THEN END查詢每個月的銷售額
SELECT YEAR(OrderDate) AS OrderYear, MONTH(OrderDate) AS OrderMonth, SUM(CASE WHEN ProductID IN (1, 3, 5) THEN OrderAmount ELSE 0 END) AS Category1Sales, SUM(CASE WHEN ProductID IN (2, 4, 6) THEN OrderAmount ELSE 0 END) AS Category2Sales, SUM(OrderAmount) AS TotalSales FROM Orders GROUP BY YEAR(OrderDate), MONTH(OrderDate);
以上代碼會返回Orders表中每個月的銷售額,根據每個訂單中所購買的產品類別進行分類匯總。
3. 使用CASE WHEN THEN END查詢每個員工的工資等級
SELECT EmployeeID, Salary, CASE WHEN Salary >= 8000 THEN '高級工程師' WHEN Salary >= 6000 THEN '中級工程師' WHEN Salary >= 4000 THEN '初級工程師' ELSE '實習生' END AS SalaryLevel FROM EmployeeSalary;
以上代碼會返回EmployeeSalary表中每個員工的工資等級,根據每個員工的薪資進行判斷。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/227267.html