SQL - CASE語句



SQL CASE 語句

SQL CASE 語句是一種條件語句,它可以幫助我們根據一組條件做出決策。它評估一組條件,並在滿足條件時返回相應的值。

CASE 語句的工作原理類似於簡化的 IF-THEN-ELSE 語句,並允許測試多個條件。

它以關鍵字 CASE 開頭,後面跟著多個條件語句。每個條件語句至少包含一對 WHEN 和 THEN 語句。其中 WHEN 指定條件語句,THEN 指定要採取的操作。

它通常用於基於現有列的值建立具有新值的新列。

讓我們看一個簡單的場景來理解這個語句。

例如,當客戶的信用額度超過“10,000”時,則該客戶將被識別為“高價值客戶”;當信用額度超過“5000”時,則該客戶將被識別為“中等價值客戶”;否則,該客戶將被識別為“低價值客戶”,如下表所示:

CASE

語法

以下是 SQL CASE 語句的語法:

CASE
   WHEN condition1 THEN statement1,
   WHEN condition2 THEN statement2,
   WHEN condition THEN statementN
   ELSE result
END;

其中,condition1, condition2, 等是條件語句,statement1, statement2, 等是在條件為真時要執行的操作。

滿足條件後,CASE 語句將停止進一步驗證,並返回結果。

  • 如果沒有任何條件滿足(TRUE),則返回ELSE子句中提到的值。

  • 如果未提及 ELSE 部分並且沒有任何條件為 TRUE,則返回 NULL。

示例

假設我們建立了一個名為CUSTOMERS的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和薪水等,使用以下查詢:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
); 

現在,使用 INSERT 語句將值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

該表將建立如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

在以下查詢中,我們對 CASE 語句使用多個 WHEN 和 THEN 條件以及 ELSE 子句。

如果客戶的 AGE 大於 30,則返回 Gen X,否則轉到進一步的 WHEN 和 THEN 條件。如果沒有任何條件與 CUSTOMERS 表匹配,則 CASE 返回 ELSE 部分中提到的“Gen Alpha”值:

SELECT NAME, AGE,
CASE 
WHEN AGE > 30 THEN 'Gen X'
WHEN AGE > 25 THEN 'Gen Y'
WHEN AGE > 22 THEN 'Gen Z'
ELSE 'Gen Alpha' 
END AS Generation
FROM CUSTOMERS;

輸出

產生的輸出如下所示:

NAME AGE Generation
Ramesh 32 Gen X
Khilan 25 Gen Z
Kaushik 23 Gen Z
Chaitali 25 Gen Z
Hardik 27 Gen Y
Komal 22 Gen Alpha
Muffy 24 Gen Z

示例

讓我們看看另一個查詢,我們希望為之前建立的 CUSTOMERS 表中每個客戶的金額小於 4500 的情況提供 25% 的加薪:

SELECT *, CASE 
WHEN SALARY < 4500 THEN (SALARY + SALARY * 25/100) 
END AS INCREMENT FROM CUSTOMERS;

輸出

在這裡,SQL 命令檢查薪水是否小於 4500。如果滿足此條件,則新列“INCREMENT”將包含等於薪水加 25% 增量的值。

由於上述查詢中未提及 ELSE 部分,並且某些 CUSTOMERS 的條件均不為真,因此返回 NULL,這表明他們沒有獲得任何加薪。

ID NAME AGE ADDRESS SALARY INCREMENT
1 Ramesh 32 Ahmedabad 2000.00 2500.000000
2 Khilan 25 Delhi 1500.00 1875.000000
3 Kaushik 23 Kota 2000.00 2500.000000
4 Chaitali 25 Mumbai 6500.00 NULL
5 Hardik 27 Bhopal 8500.00 NULL
6 Komal 22 Hyderabad 4500.00 NULL
7 Muffy 24 Indore 10000.00 NULL

帶有 ORDER BY 子句的 CASE 語句

我們可以將 CASE 語句與 ORDER BY 子句一起使用。SQL 中的 ORDER BY 子句按升序(預設)或降序對結果進行排序。

示例

在此查詢中,CASE 語句用於根據“NAME”列的值按“NAME”列或“ADDRESS”列對結果進行排序。如果“NAME”列以“K”開頭,則按“NAME”列對結果進行排序;否則,按“ADDRESS”列對結果進行排序:

SELECT * FROM CUSTOMERS
ORDER BY
(CASE
    WHEN NAME LIKE 'k%' THEN NAME
    ELSE ADDRESS
END);

輸出

執行上述查詢獲得的結果如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
3 Kaushik 23 Kota 2000.00
2 Khilan 25 Delhi 1500.00
6 Komal 22 Hyderabad 4500.00
4 Chaitali 25 Mumbai 6500.00

帶有 GROUP BY 子句的 CASE 語句

我們還可以將 CASE 語句與 GROUP BY 子句一起使用。SQL 中的 GROUP BY 子句將具有相同值的行的分組到一個或多個列中,其中應用聚合函式以生成彙總。

示例

在以下查詢中,我們根據客戶的薪水對客戶進行分組,並計算指定客戶資料範圍內的薪水總和。

如果 SALARY 中的值小於或等於 4000,則資料將被分組為“最低薪”。如果該值大於 4000 且小於或等於 6500,則將其分組為“平均薪”。所有其他值將被分組為“最高薪”。SUM 函式用於計算每個組的 SALARY 總和:

SELECT 
   CASE 
      WHEN SALARY <= 4000 THEN 'Lowest paid'
      WHEN SALARY > 4000 AND SALARY <= 6500 THEN 'Average paid'
   ELSE 'Highest paid' 
      END AS SALARY_STATUS,
   SUM(SALARY) AS Total
   FROM CUSTOMERS
   GROUP BY 
   CASE 
      WHEN SALARY <= 4000 THEN 'Lowest paid'
      WHEN SALARY > 4000 AND SALARY <= 6500 THEN 'Average paid'
   ELSE 'Highest paid'
END;

輸出

以下是上述查詢的輸出:

SALARY_STATUS Total
Lowest paid 5500.00
Average paid 11000.00
Highest paid 18500.00

帶有 WHERE 子句的 CASE 語句

我們也可以將 CASE 語句與 WHERE 子句一起使用。WHERE 子句用於根據指定的條件篩選表中的行。

示例

在以下查詢中,CASE 語句用於根據客戶的 AGE 返回客戶的不同職位。WHERE 子句用於根據客戶的 SALARY 篩選行:

SELECT NAME, ADDRESS, 
   CASE 
      WHEN AGE < 25 THEN 'Intern'
      WHEN AGE >= 25 and AGE <= 27 THEN 'Associate Engineer'
      ELSE 'Senior Developer'
   END as Designation
FROM CUSTOMERS
WHERE SALARY >= 2000;

輸出

上述查詢的輸出如下所示:

NAME ADDRESS Designation
Ramesh Ahmedabad Senior Developer
Kaushik Kota Intern
Chaitali Mumbai Associate Engineer
Hardik Bhopal Associate Engineer
Komal Hyderabad Intern
Muffy Indore Intern

帶有 UPDATE 的 CASE 語句

我們可以在 UPDATE 語句中使用 CASE 語句對錶中的資料執行條件更新。

示例

在以下查詢中,我們根據客戶的年齡更新所有客戶的薪水。

如果客戶的年齡等於“25”,則他們的薪水將更新為“17000”。如果年齡等於“32”,則將更新為“25000”。對於其他年齡的客戶,薪水將更新為“12000”:

UPDATE CUSTOMERS
SET SALARY= 
CASE AGE
WHEN 25 THEN 17000
WHEN 32 THEN 25000
ELSE 12000
END;

輸出

我們得到以下結果。我們可以觀察到 7 行發生了更改:

Query OK, 7 rows affected (0.02 sec)
Rows matched: 7  Changed: 7  Warnings: 0

驗證

我們可以使用以下查詢更正對 CUSTOMERS 表所做的更改:

SELECT * FROM CUSTOMERS;

該表顯示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 25000.00
2 Khilan 25 Delhi 17000.00
3 Kaushik 23 Kota 12000.00
4 Chaitali 25 Mumbai 17000.00
5 Hardik 27 Bhopal 12000.00
6 Komal 22 Hyderabad 12000.00
7 Muffy 24 Indore 12000.00

如上表所示,所有客戶的 SALARY 都已根據其年齡進行了更新。

帶有 INSERT 的 CASE 語句

我們還可以藉助 CASE 語句將資料插入 MySQL 表中。我們需要為資料插入提供帶有列名和值的 INSERT INTO 語句。

示例

在這裡,如果客戶的年齡大於或等於 25,則薪水將為 23000;否則,薪水將為 14000:

INSERT INTO CUSTOMERS (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (10, 'Viren', 28, 'Varanasi', 
   CASE 
      WHEN AGE >= 25 THEN 23000
      ELSE 14000
   END
);

輸出

我們得到了以下結果。我們可以觀察到更改發生在 1 行中 -

Query OK, 1 row affected (0.01 sec)

驗證

我們可以使用以下查詢更正對 CUSTOMERS 表所做的更改:

SELECT * FROM CUSTOMERS;

該表顯示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00
10 Viren 28 Varanasi 23000.00
廣告