CASE trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng biểu thức CASE trong SQL Server để thêm logic if-else vào các truy vấn SQL.

Biểu thức CASE trong SQL Server đánh giá danh sách các điều kiện và trả về một trong nhiều kết quả được chỉ định. Biểu thức CASE có hai dạng: biểu thức CASE và biểu thức CASE tìm kiếm. Cả hai dạng biểu thức CASE đều hỗ trợ một câu lệnh ELSE tùy chọn.

Bởi vì CASE là một biểu thức, bạn có thể sử dụng nó trong bất kỳ mệnh đề chấp nhận một biểu thức như SELECT, WHERE, GROUP BYHAVING.

Biểu thức CASE đơn giản trong SQL Server

Sau đây là cú pháp của biểu thức CASE đơn giản:

CASE input   
    WHEN e1 THEN r1
    WHEN e2 THEN r2
    ...
    WHEN en THEN rn
    [ ELSE re ]   
END

Biểu thức CASE đơn giản so sánh biểu thức đầu vào (input) với biểu thức (ei) trong mỗi mệnh đề WHEN có bằng nhau không. Nếu biểu thức đầu vào bằng một biểu thức (ei) trong mệnh đề WHEN, thì kết quả (ri) trong mệnh đề THEN tương ứng được trả về.

Nếu biểu thức đầu vào không bằng bất kỳ biểu thức nào và có sẵn mệnh đềELSE, biểu thức CASE sẽ trả về kết quả trong mệnh đề ELSE (re).

Trong trường hợp mệnh đề ELSE bị bỏ qua và biểu thức đầu vào không bằng bất kỳ biểu thức nào trong mệnh đề WHEN, biểu thức CASE sẽ trả về NULL.

Sử dụng biểu thức CASE đơn giản trong mệnh đề SELECT

Xem bảng sales.orders sau từ cơ sở dữ liệu mẫu:

Sử dụng biểu thức CASE đơn giản trong mệnh đề SELECT

Ví dụ này sử dụng hàm COUNT() với mệnh đề GROUP BY để trả về số đơn đặt hàng cho từng trạng thái của đơn đặt hàng:

SELECT    
    order_status, 
    COUNT(order_id) order_count
FROM    
    sales.orders
WHERE 
    YEAR(order_date) = 2018
GROUP BY 
    order_status;

Đây là đầu ra:

Sử dụng biểu thức CASE đơn giản trong mệnh đề SELECT

Các giá trị trong cột order_status là số, không có ý nghĩa trong trường hợp này. Để làm cho đầu ra dễ hiểu hơn, bạn có thể sử dụng biểu thức CASE đơn giản như được hiển thị trong truy vấn sau:

SELECT    
    CASE order_status
        WHEN 1 THEN 'Pending'
        WHEN 2 THEN 'Processing'
        WHEN 3 THEN 'Rejected'
        WHEN 4 THEN 'Completed'
    END AS order_status, 
    COUNT(order_id) order_count
FROM    
    sales.orders
WHERE 
    YEAR(order_date) = 2018
GROUP BY 
    order_status;

Hình ảnh sau đây cho thấy kết quả đầu ra:

Sử dụng biểu thức CASE đơn giản trong mệnh đề SELECT

Sử dụng biểu thức CASE đơn giản trong hàm tổng hợp

Xem truy vấn sau:

SELECT    
    SUM(CASE
            WHEN order_status = 1
            THEN 1
            ELSE 0
        END) AS 'Pending', 
    SUM(CASE
            WHEN order_status = 2
            THEN 1
            ELSE 0
        END) AS 'Processing', 
    SUM(CASE
            WHEN order_status = 3
            THEN 1
            ELSE 0
        END) AS 'Rejected', 
    SUM(CASE
            WHEN order_status = 4
            THEN 1
            ELSE 0
        END) AS 'Completed', 
    COUNT(*) AS Total
FROM    
    sales.orders
WHERE 
    YEAR(order_date) = 2018;

Đây là đầu ra:

Biểu thức CASE tìm kiếm trong SQL Server

Sau đây là cú pháp của biểu thức CASE tìm kiếm:

CASE  
    WHEN e1 THEN r1
    WHEN e2 THEN r2
    ...
    WHEN en THEN rn
    [ ELSE re ]   
END

Trong cú pháp này:

  • e1, e2,… ei,… en là các biểu thức Boolean.
  • r1, r2,… ri,…, hoặc rn là một trong những kết quả có thể.

Biểu thức CASE tìm kiếm đánh giá biểu thức Boolean trong mỗi mệnh đề WHEN theo thứ tự được chỉ định và trả về kết quả (ri) nếu biểu thức Boolean (ei) cho giá trị TRUE.

Nếu không có biểu thức Boolean nào được đánh giá là TRUE, biểu thức CASE tìm kiếm trả về kết quả (re) trong mệnh đề ELSE hoặc NULL nếu mệnh đề ELSE không được chỉ định.

Sử dụng biểu thức CASE tìm kiếm trong mệnh đề SELECT

Xem các bảng sales.orderssales.order_items từ cơ sở dữ liệu mẫu:

Biểu thức CASE tìm kiếm trong SQL Server

Câu lệnh sau sử dụng biểu thức CASE tìm kiếm để phân loại đơn hàng bán hàng theo giá trị đơn hàng:

SELECT    
    o.order_id, 
    SUM(quantity * list_price) order_value,
    CASE
        WHEN SUM(quantity * list_price) <= 500 
            THEN 'Very Low'
        WHEN SUM(quantity * list_price) > 500 AND 
            SUM(quantity * list_price) <= 1000 
            THEN 'Low'
        WHEN SUM(quantity * list_price) > 1000 AND 
            SUM(quantity * list_price) <= 5000 
            THEN 'Medium'
        WHEN SUM(quantity * list_price) > 5000 AND 
            SUM(quantity * list_price) <= 10000 
            THEN 'High'
        WHEN SUM(quantity * list_price) > 10000 
            THEN 'Very High'
    END order_priority
FROM    
    sales.orders o
INNER JOIN sales.order_items i ON i.order_id = o.order_id
WHERE 
    YEAR(order_date) = 2018
GROUP BY 
    o.order_id;

Hình ảnh sau đây cho thấy đầu ra một phần:

Biểu thức CASE tìm kiếm trong SQL Server

Trong hướng dẫn này, bạn đã học cách sử dụng biểu thức CASE trong SQL Server để thêm logic if-else vào các truy vấn SQL.

SQL Server
Bài Viết Liên Quan:
Hướng dẫn đầy đủ về Expression trong SQL Server
Trung Nguyen 18/03/2021
Hướng dẫn đầy đủ về Expression trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng biểu thức CASE, COALESCE và NULLIF trong SQL Server.

NULLIF trong SQL Server
Trung Nguyen 18/03/2021
NULLIF trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng biểu thức NULLIF trong SQL Server để trả về NULL nếu đối số đầu tiên bằng đối số thứ hai.

COALESCE trong SQL Server
Trung Nguyen 18/03/2021
COALESCE trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng biểu thức COALESCE trong SQL Server để xử lý giá trị NULL trong các truy vấn.

MERGE trong SQL Server
Trung Nguyen 18/03/2021
MERGE trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng câu lệnh MERGE trong SQL Server để cập nhật dữ liệu trong bảng dựa trên các giá trị được khớp từ một bảng khác.