MySQL case表示式

2019-10-16 22:54:53

在本教學中,我們將向您展示如何使用MySQL CASE表示式來構造條件查詢。

MySQL CASE表示式簡介

MySQL CASE表示式是一個流控制結構,允許您在查詢中構造條件,例如:SELECTWHERE子句。 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_1compare_value_2等,則CASE表示式返回相應的結果,即result_1result_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_1result_2等。 如果所有條件都為false,則返回ELSE部分中的結果。如果省略ELSE部分,CASE表示式將返回NULL

CASE表示式返回的資料型別取決於使用它的上下文的結果。 例如,如果在字串上下文中使用CASE表示式,則會以字串形式返回結果。 如果在數值上下文中使用CASE表示式,則會以整數,小數或實數值的形式返回結果。

MySQL 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表示式來確定要排序的欄位為: statecountry

在接下來的一個範例中,我們將使用範例資料庫(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語句中,如果狀態等於ShippedOn Hold等,則CASE表示式返回1,否則返回0,我們使用SUM函式計算每種狀態的訂單的銷售總數。

在本教學中,我們向您展示了如何在SELECT語句中使用MySQL CASE表示式來構造條件查詢。