Trong SQL thì chúng ta có case when ,trong các ngôn ngữ lập trình (hoặc excel) chúng ta có if-else để biểu thị các trường hợp mà có nhiều tình huống có thể xảy ra khi dữ liệu đầu vào thay đổi. Trong bài viết này chúng ta sẽ tìm hiểu các sử dụng chúng nhé.
Table of Contents
Cú pháp
Có 2 cách để viết case when trong SQL.
Cách 1
CASE cot_gia_tri
WHEN gia_tri1 THEN cau_lenh1
[WHEN gia_tri2 THEN cau_lenh2] ...
[ELSE cau_lenhelse]
END CASE
Ở cách này các bạn sẽ dùng một cột và sao đó sau when sẽ là các giá trị mà bạn muốn match. Cách này có phần giống với match-case trong python 3.10
Cách 2
CASE
WHEN dieu_kien1 THEN cau_lenh1
[WHEN dieu_kien2 THEN cau_lenh2] ...
[ELSE cau_lenhelse]
END CASE
cách này sẽ check từng điều kiện khi con trỏ scan qua 1 dòng, và điều kiện này có thể truy cập được nhiều cột cùng một lúc.
Ví dụ
ten | diem_tienganh | diem_toan |
A | 5 | 10 |
B | 6 | 10 |
D | 4 | 3 |
E | 4 | 4 |
Cách 1
Như đã nói ở trên cách 1 là match case tức là sẽ check 1 cột sao đó thực hiện 1 phép tính (hoặc đơn giản là trả về 1 cột giá trị khác chẳng hạn).
Bây giờ chúng ta sẽ tìm xem ai là bạn A, cho bạn vào nhóm con cô giáo, và nâng điểm tiếng anh của bạn lên 10, ngoài ra thêm cho bạn B 2 điểm do là con hiệu trưởng. Hãy dùng SQL như sau.
SELECT ten,
CASE ten
WHEN 'A' THEN diem_tienganh + 5,
WHEN 'B' THEN diem_tienganh + 2,
ELSE diem_tienganh end as diem_tienganh,
diem_toan,
CASE ten
WHEN 'A' THEN 'Con co giao'
ELSE 'Con nguoi ta' END AS real_con_co
FROM bang_diem_lop
Kết quả
ten | diem_tienganh | diem_toan | real_con_co |
A | 10 | 10 | Con co giao |
B | 8 | 10 | Con nguoi ta |
D | 4 | 3 | Con nguoi ta |
E | 4 | 4 | Con nguoi ta |
như vậy chúng ta đã hoàn thành nâng điểm bằng case when theo cách 1. Chúng ta có thể viết lại câu lệnh trên theo cách 2 như dưới đây.
Cách 2
Trước khi làm bài mới chúng ta viết lại bài trên theo cách 2 xem sao, kết quả như dưới đây
SELECT ten,
CASE
WHEN ten = 'A' THEN diem_tienganh + 5,
WHEN ten = 'B' THEN diem_tienganh + 2,
ELSE diem_tienganh end as diem_tienganh,
diem_toan,
CASE
WHEN ten = 'A' THEN 'Con co giao'
ELSE 'Con nguoi ta' END AS real_con_co
FROM bang_diem_lop
Phía trên là viết lại bài 1 nhưng theo cách 2
Bây giờ chúng ta viết thêm 1 bài nữa, để xếp loại học sinh giỏi, học sinh giỏi là học sinh có điểm trung bình lớn hơn 5. Để làm điều đó chúng ta xét trường hợp (diem_tienganh+diem_toan)/2 > 5
SELECT ten,
CASE
WHEN (diem_tienganh+diem_toan)/2 > 5 then 'Hoc sinh gioi'
ELSE 'Hoc sinh do' END AS xep_loai
FRIN bang_diem_lop
Kết quả:
ten | xep_loai |
A | Hoc sinh gioi |
B | Hoc sinh gioi |
D | Hoc sinh do |
E | Hoc sinh do |
Như vậy các bạn có thể thấy, ở cách 2, việc xét giá trị đầu vào không bị giới hạn ở 1 cột duy nhất, mà có thể dùng giá trị 2 cột, thậm chí là tính toán giá trị trung bình và so sánh nữa.
Kết bài
Cảm ơn các bạn đã đón đọc hướng dẫn cách sử dụng CASE WHEN, nhớ theo dõi và ủng hộ blog nếu bạn cảm thấy thích nhé.