CASE WHEN trong SQL

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é.

CASE WHEN trong SQL

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ụ

tendiem_tienganhdiem_toan
A510
B610
D43
E44
bang_diem_lop

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ả

tendiem_tienganhdiem_toanreal_con_co
A1010Con co giao
B810Con nguoi ta
D43Con nguoi ta
E44Con nguoi ta
bang_diem_lop

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ả:

tenxep_loai
AHoc sinh gioi
BHoc sinh gioi
DHoc sinh do
EHoc sinh do
bang_diem_lop

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é.

Leave a Comment

Scroll to Top