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 BY
và HAVING
.
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:

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:

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 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.orders
và sales.order_items
từ cơ sở dữ liệu mẫu:

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:

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.