在本教學中,我們將向您展示如何使用MySQL CASE
表示式來構造條件查詢。
MySQL CASE
表示式是一個流控制結構,允許您在查詢中構造條件,例如:SELECT或WHERE子句。 MySQL為您提供了兩種形式的CASE
表示式。
以下說明了CASE
表示式的第一種形式。
CASE value
WHEN compare_value_1 THEN result_1
WHEN compare_value_2 THEN result_2
…
ELSE result END
如果value
等於compare_value
,例如compare_value_1
,compare_value_2
等,則CASE
表示式返回相應的結果,即result_1
,result_2
。 如果值不與任何compare_value
匹配,則CASE
表示式將返回ELSE
子句中指定的結果。
CASE
表示式的第二種形式如下:
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
…
ELSE result END
在第二種形式中,如果條件為True
,則CASE
表示式返回結果,如result_1
,result_2
等。 如果所有條件都為false
,則返回ELSE
部分中的結果。如果省略ELSE
部分,CASE
表示式將返回NULL
。
CASE
表示式返回的資料型別取決於使用它的上下文的結果。 例如,如果在字串上下文中使用CASE
表示式,則會以字串形式返回結果。 如果在數值上下文中使用CASE
表示式,則會以整數,小數或實數值的形式返回結果。
讓我們來看看範例資料庫(yiibaidb)中的customers
表,其結構如下所示 -
mysql> desc customers;
+------------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| customerNumber | int(11) | NO | PRI | NULL | |
| customerName | varchar(50) | NO | | NULL | |
| contactLastName | varchar(50) | NO | | NULL | |
| contactFirstName | varchar(50) | NO | | NULL | |
| phone | varchar(50) | NO | | NULL | |
| addressLine1 | varchar(50) | NO | | NULL | |
| addressLine2 | varchar(50) | YES | | NULL | |
| city | varchar(50) | NO | | NULL | |
| state | varchar(50) | YES | | NULL | |
| postalCode | varchar(15) | YES | | NULL | |
| country | varchar(50) | NO | | NULL | |
| salesRepEmployeeNumber | int(11) | YES | MUL | NULL | |
| creditLimit | decimal(10,2) | YES | | NULL | |
+------------------------+---------------+------+-----+---------+-------+
13 rows in set
假設您要按狀態對客戶進行排序,如果狀態為NULL
,則要使用國家作為排序標準。要實現這一點,您可以使用第一種形式的CASE
表示式如下:
SELECT
customerName, state, country
FROM
customers
ORDER BY (CASE
WHEN state IS NULL THEN country
ELSE state
END);
執行上面查詢語句,得到以下結果 -
+------------------------------------+---------------+--------------+
| customerName | state | country |
+------------------------------------+---------------+--------------+
| Salzburg Collectables | NULL | Austria |
| Mini Auto Werke | NULL | Austria |
| Canadian Gift Exchange Network | BC | Canada |
| Royal Canadian Collectables, Ltd. | BC | Canada |
| Petit Auto | NULL | Belgium |
| Royale Belge | NULL | Belgium |
| Mini Gifts Distributors Ltd. | CA | USA |
| Mini Wheels Co. | CA | USA |
************ 此處省略了一大波資料 *************************************
| AV Stores, Co. | NULL | UK |
| UK Collectables, Ltd. | NULL | UK |
| Stylish Desk Decors, Co. | NULL | UK |
| Double Decker Gift Stores, Ltd | NULL | UK |
| Australian Collectors, Co. | Victoria | Australia |
| Australian Collectables, Ltd | Victoria | Australia |
+------------------------------------+---------------+--------------+
122 rows in set
在本範例中,我們使用ORDER BY子句中的CASE
表示式來確定要排序的欄位為: state
或 country
。
在接下來的一個範例中,我們將使用範例資料庫(yiibaidb)中的orders
表來演示CASE
表示式的第二種形式。
如果您希望通過按狀態檢視銷售訂單數量,例如發貨訂單數量,待發貨訂單等,則可以使用CASE
表示式的第二種形式,如下所示:
SELECT
SUM(CASE
WHEN status = 'Shipped' THEN 1
ELSE 0
END) AS 'Shipped',
SUM(CASE
WHEN status = 'On Hold' THEN 1
ELSE 0
END) AS 'On Hold',
SUM(CASE
WHEN status = 'In Process' THEN 1
ELSE 0
END) AS 'In Process',
SUM(CASE
WHEN status = 'Resolved' THEN 1
ELSE 0
END) AS 'Resolved',
SUM(CASE
WHEN status = 'Cancelled' THEN 1
ELSE 0
END) AS 'Cancelled',
SUM(CASE
WHEN status = 'Disputed' THEN 1
ELSE 0
END) AS 'Disputed',
COUNT(*) AS Total
FROM
orders;
執行上面查詢語句,得到以下結果 -
+---------+---------+------------+----------+-----------+----------+-------+
| Shipped | On Hold | In Process | Resolved | Cancelled | Disputed | Total |
+---------+---------+------------+----------+-----------+----------+-------+
| 303 | 4 | 7 | 4 | 6 | 3 | 327 |
+---------+---------+------------+----------+-----------+----------+-------+
1 row in set
在SELECT語句中,如果狀態等於Shipped
,On Hold
等,則CASE
表示式返回1
,否則返回0
,我們使用SUM
函式計算每種狀態的訂單的銷售總數。
在本教學中,我們向您展示了如何在SELECT
語句中使用MySQL CASE
表示式來構造條件查詢。