MySQL(36)如何使用CASE进行条件表达式?

130 阅读3分钟

CASE 语句在SQL中用于实现条件逻辑处理,可以在 SELECTUPDATEDELETE 等语句中使用。CASE 语句的功能类似于编程语言中的 if-elseswitch-case 结构,它可以根据不同的条件返回不同的结果。

基本语法

CASE 语句有两种形式:简单 CASE 和搜索 CASE。

简单 CASE

CASE column_name
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE default_result
END

搜索 CASE

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END

示例数据库和表结构

假设我们有一个名为 orders 的表,用于存储订单信息。

-- 创建数据库
CREATE DATABASE shop;

-- 选择数据库
USE shop;

-- 创建表 orders
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    customer_name VARCHAR(100),
    order_date DATE,
    amount DECIMAL(10, 2),
    status VARCHAR(50)
);

-- 插入示例数据到 orders 表
INSERT INTO orders (customer_name, order_date, amount, status)
VALUES 
('John Doe', '2023-10-01', 250.00, 'Pending'),
('Jane Smith', '2023-09-15', 450.00, 'Completed'),
('Alice Johnson', '2023-08-20', 300.00, 'Pending'),
('Bob Brown', '2023-07-05', 150.00, 'Cancelled');

1. 使用 CASE 在 SELECT 语句中

语法:

简单 CASE:

SELECT order_id,
       customer_name,
       CASE status
           WHEN 'Pending' THEN 'Order in Progress'
           WHEN 'Completed' THEN 'Order Finished'
           WHEN 'Cancelled' THEN 'Order Cancelled'
           ELSE 'Unknown Status'
       END AS order_status
FROM orders;

搜索 CASE:

SELECT order_id,
       customer_name,
       CASE
           WHEN amount < 200 THEN 'Low Value'
           WHEN amount BETWEEN 200 AND 400 THEN 'Medium Value'
           ELSE 'High Value'
       END AS order_value_category
FROM orders;

示例:

SELECT order_id,
       customer_name,
       amount,
       CASE status
           WHEN 'Pending' THEN 'Order in Progress'
           WHEN 'Completed' THEN 'Order Finished'
           WHEN 'Cancelled' THEN 'Order Cancelled'
           ELSE 'Unknown Status'
       END AS order_status
FROM orders;

结果:

order_id | customer_name | amount | order_status
---------|---------------|--------|-------------------
1        | John Doe      | 250.00 | Order in Progress
2        | Jane Smith    | 450.00 | Order Finished
3        | Alice Johnson | 300.00 | Order in Progress
4        | Bob Brown     | 150.00 | Order Cancelled
SELECT order_id,
       customer_name,
       amount,
       CASE
           WHEN amount < 200 THEN 'Low Value'
           WHEN amount BETWEEN 200 AND 400 THEN 'Medium Value'
           ELSE 'High Value'
       END AS order_value_category
FROM orders;

结果:

order_id | customer_name | amount | order_value_category
---------|---------------|--------|----------------------
1        | John Doe      | 250.00 | Medium Value
2        | Jane Smith    | 450.00 | High Value
3        | Alice Johnson | 300.00 | Medium Value
4        | Bob Brown     | 150.00 | Low Value

2. 使用 CASE 在 UPDATE 语句中

语法:

UPDATE table_name
SET column_name = CASE
                      WHEN condition1 THEN result1
                      WHEN condition2 THEN result2
                      ...
                      ELSE default_result
                  END
WHERE some_condition;

示例:

将所有订单金额分类,并更新 status 列:

UPDATE orders
SET status = CASE
                 WHEN amount < 200 THEN 'Low Value'
                 WHEN amount BETWEEN 200 AND 400 THEN 'Medium Value'
                 ELSE 'High Value'
             END;

更新后的表:

order_id | customer_name | amount | status
---------|---------------|--------|-------------
1        | John Doe      | 250.00 | Medium Value
2        | Jane Smith    | 450.00 | High Value
3        | Alice Johnson | 300.00 | Medium Value
4        | Bob Brown     | 150.00 | Low Value

3. 使用 CASE 在 DELETE 语句中

虽然 CASE 语句在删除操作中不常用,因为删除操作通常基于较简单的条件,但在某些复杂条件下可以使用。

语法:

DELETE FROM table_name
WHERE CASE
          WHEN condition1 THEN column_name = value1
          WHEN condition2 THEN column_name = value2
          ...
          ELSE column_name = default_value
      END;

示例:

假设我们希望删除所有状态为 "Low Value" 或 "Cancelled" 的记录:

DELETE FROM orders
WHERE status = CASE
                   WHEN status = 'Low Value' THEN 'Low Value'
                   WHEN status = 'Cancelled' THEN 'Cancelled'
                   ELSE 'Keep'
               END;

删除后的表:

order_id | customer_name | amount | status
---------|---------------|--------|-------------
1        | John Doe      | 250.00 | Medium Value
2        | Jane Smith    | 450.00 | High Value
3        | Alice Johnson | 300.00 | Medium Value

小结

CASE 语句是SQL中一个强大的工具,用于根据不同的条件返回不同的结果。通过在 SELECTUPDATEDELETE 语句中使用 CASE 语句,可以实现复杂的条件逻辑处理,极大地提高了SQL查询的灵活性和功能性。上述示例展示了如何在不同情况下使用 CASE 语句,以实现条件表达式处理。