Vấn đề:
Bạn muốn sử dụng câu lệnh CASE trong SQL.
Ví dụ:
Bạn có kết quả kiểm tra trong exam
bàn. Bạn cần chỉ định mỗi kết quả cho một trong các giá trị văn bản sau:'bad result'
, 'average result'
hoặc 'good result'
. Kết quả xấu là những kết quả dưới 40, kết quả tốt là trên 70 và phần còn lại là kết quả trung bình.
exam
bảng trông như thế này:
name | kết quả |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Lane Sloan | 70 |
Steff Fox | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Giải pháp 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
Bảng kết quả trông như thế này:
name | kết quả | loại |
---|---|---|
Toby Shaw | 56 | kết quả trung bình |
Casey Watson | 49 | kết quả trung bình |
Bennie Lynn | 23 | kết quả không tốt |
Lane Sloan | 70 | kết quả trung bình |
Steff Fox | 85 | kết quả tốt |
Reggie Ward | 40 | kết quả trung bình |
Gail Kennedy | 66 | kết quả trung bình |
Brice Mueller | 90 | kết quả tốt |
Thảo luận:
Để hiển thị giá trị dựa trên (các) điều kiện cụ thể của bạn, bạn cần viết CASE
tuyên bố. Cú pháp là:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Nếu condition_1
được đáp ứng, khi đó giá trị được truy xuất là value_1
. Nếu không, thì cơ sở dữ liệu sẽ kiểm tra condition_2
. Nếu condition_2
là true, khi đó giá trị được truy xuất là value_2
. Nếu cả hai điều kiện này đều không được đáp ứng, SQL sẽ kiểm tra từng điều kiện còn lại theo thứ tự cho đến khi một trong các điều kiện được đáp ứng. Nếu không có điều kiện nào được đáp ứng, thì value_n
được chỉ định sau ELSE
được truy xuất.
ELSE
một phần là tùy chọn. Nếu bạn bỏ qua nó và không có điều kiện nào được đáp ứng, bạn sẽ nhận được NULL
.
Nhớ END
CASE
mệnh đề khi bạn đã hoàn thành với tất cả các điều kiện. Tất nhiên, như với bất kỳ cột nào bạn tạo, bạn có thể đổi tên nó (AS <column_name>
).
Trong ví dụ của chúng tôi, 'bad result'
được chỉ định khi result < 40, and 'good result'
được chỉ định khi result > 70
. Nếu cả hai điều kiện này đều không được đáp ứng, giá trị là 'average result'
. Ngoài ra, để đặt tên cho cột mới tạo của các giá trị văn bản, bạn cần sử dụng bí danh (AS
thể loại). Đây là cách bạn nhận được:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Vì 'average result'
được gán cho các kết quả giữa 40
và 70
(bao gồm), bạn cũng có thể viết một điều kiện thay vì ELSE
(xem Giải pháp 2 bên dưới). Tuy nhiên, sử dụng ELSE
dễ dàng hơn .
Giải pháp 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
Bảng kết quả trông như thế này:
name | kết quả | loại |
---|---|---|
Toby Shaw | 56 | kết quả trung bình |
Casey Watson | 49 | kết quả trung bình |
Bennie Lynn | 23 | kết quả không tốt |
Lane Sloan | 70 | kết quả trung bình |
Steff Fox | 85 | kết quả tốt |
Reggie Ward | 40 | kết quả trung bình |
Gail Kennedy | 66 | kết quả trung bình |
Brice Mueller | 90 | kết quả tốt |
Thảo luận:
Vì 'average result'
được gán cho các kết quả giữa 40
và 70
(bao gồm), bạn có thể viết điều kiện sau thay vì ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Nếu bạn không sử dụng ELSE
và không muốn bất kỳ NULL
nào s trong danh mục category
, bạn cần đảm bảo rằng bạn quan tâm đến tất cả result
có thể có các giá trị. Nếu có result
không đáp ứng điều kiện nào, bạn sẽ nhận được NULL
.
Giải pháp 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
Bảng kết quả trông như thế này:
name | kết quả | loại |
---|---|---|
Toby Shaw | 56 | kết quả trung bình |
Casey Watson | 49 | kết quả trung bình |
Bennie Lynn | 23 | kết quả không tốt |
Lane Sloan | 70 | kết quả trung bình |
Steff Fox | 85 | kết quả tốt |
Reggie Ward | 40 | kết quả trung bình |
Gail Kennedy | 66 | kết quả trung bình |
Brice Mueller | 90 | kết quả tốt |
Thảo luận:
Các điều kiện được chỉ định trong CASE
có thể không chồng chéo như các giải pháp trước hoặc không chồng chéo như trong giải pháp này. Điều kiện đầu tiên giống như trước - cho result < 40
, category
là 'bad result'
. Tất cả kết quả bên dưới 40
được gán giá trị này tại thời điểm này và bạn không cần phải làm gì với chúng nữa. Điều này có nghĩa là không cần đảm bảo result >= 40
trong việc chỉ định các điều kiện cho 'average result'
- tất cả các kết quả nhỏ hơn 40 đã có giá trị 'bad result'
giao. Cuối cùng, đối với các kết quả còn lại, danh mục phải là 'good result'
; một ELSE 'good result'
chăm sóc nó. Đây là cách bạn nhận được:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Lưu ý:Thứ tự của các điều kiện trong CASE
các vấn đề. Nếu bạn đảo ngược thứ tự của hai điều kiện đầu tiên (tức là nếu bạn chỉ định WHEN result <= 70 THEN 'average result'
đầu tiên sau đó đến WHEN result <= 70 THEN 'average result'
thứ hai), tất cả các kết quả nhỏ hơn hoặc bằng 70
kết thúc bằng 'average result'
danh mục, không có kết quả nào được gán cho 'bad result'
danh mục.