Tuốt tuồn tuột về CASE WHEN trong SQL

SQL là dễ với Senior, nhưng với những bạn bắt đầu tìm hiểu SQL thì thực tế lại không hề đơn giản như vậy, nắm bắt được nhu cầu, tâm tư tình cảm như vậy, TopDev giới thiệu tới anh em bài viết giải thích tường tận về Case When trong SQL.

Mong là qua bài viết này, anh em bắt đầu với SQL dễ dàng hơn, từ Case When sẽ tới các mục khác khó hơn trong SQL.

Anh em chú ý đón đọc chuỗi bài viết về SQL trên TopDev, ngày trở thành SQL Master không còn xa. Bắt đầu ngay thôi nào!.

1. Luôn luôn bắt đầu với ví dụ và định nghĩa

Rồi, giả sử ha, anh em được cô giao cho chức vụ quyền uy nhất lớp, lớp trưởng (à đâu, lớp phó phụ trách văn nghệ). Đợt này cần tập múa (múa quạt đi cho máu), mà tập ở Quận 6 nên cô cần biết danh sách các bạn ở HCM.

Cô già mắt kém, chữ ngắn khó đọc nên HCM thì khó cho cô, cô yêu cầu nhìn thấy bạn nào ở TP Hồ Chí Minh để cô lựa.

Trong hệ cơ sở dữ liệu cô đang có sẵn danh sách các bạn cùng lớp (teammate), khổ cái là cái tool mà cô sử dụng để input lúc viết lại do một ông thần khác có tính cách không lèo nhèo.

Ví dụ bạn Sơn Tùng ở TP Hồ Chí Minh thì ổng chỉ lưu là HCM, còn bạn Erik tuy là chạy về nhà khóc với anh nhưng nhà ở Đồng Nai, chạy bộ không nổi. Ở Đồng Nai thì lưu xuống lại là DN2, do trùng với Đà Nẵng, chua lè.

Case when trong sql Cơ bản thì từ mã tỉnh thành viết tắt lưu xuống ta có thể lấy được địa chỉ đầy đủ như này

1.1 Tìm hướng giải quyết

Rồi, yêu cầu của cô là lấy danh sách các bạn cùng lớp thân thương yêu quý lên. Nhưng chỗ địa chỉ thì không được viết tắt. Tức là nếu bạn đó ở HCM thì show ra chỗ SQL result là Hồ Chí Minh, còn nếu bạn ở ĐN thì SQL result là Đồng Nai.

Tiền đề là không có bảng “Địa chỉ” để mà left join, inner join gì luôn nha anh em. Đang đưa đường dẫn lối cho Case When trong SQL nên không chơi kiểu thế. Haha.

Rồi mường tượng trong đầu là có một danh sách các bạn, giờ nếu mà gặp cái cột TinhThanh (hiện đang viết tắt). Mường tượng trong đầu ta có 4 bước.

Case when trong sql

Thơm lun, thấy có “Nếu bạn nào” là thấy giống If Else rồi. Đúng, là giống, nhưng đang học syntax Case When trong SQL nên cứ từ từ.

Để giải bài tập cô giao bằng SQL, ta có thể sử dụng câu SQL sau.

SELECT TinhThanh,
CASE 
	WHEN 
    	TinhThanh = "HCM" 
    THEN 
    	"Ho Chi Minh"
    WHEN 
    	TinhThanh = "DN" 
    THEN "Da Nang"
    
ELSE TinhThanh
END AS "Cap Nhat Thanh Pho" 

FROM BanBe

1.2 Giải thích chi tiết

Với câu SQL trên, nhìn rối rắm khó hiểu cho người bắt đầu nên cứ bẻ nhỏ từng chữ từng chữ. Không có gì phải vội. SELECT là rồi ha, dễ hiểu.

CASE: indicates a condition loop has been started and that the conditions will follow.

CASE là trường hợp, nó xác định rằng một điều kiện kiểm tra sắp bắt đầu và tiếp theo sau nó sẽ là điều kiện kiểm tra

WHEN: indicates the start of a condition that should be checked by the query.

WHEN là trong khi, nó xác định rằng một điều kiện cần được kiểm tra bởi câu truy vấn

THEN: executed when the condition is true, determines the output for the true condition.

THEN là thì, nó thực thi nếu điều kiện ở WHEN là đúng.

ELSE: catches all of the entries that were not true for any of the WHEN conditions.

Else là khác, nó sẽ xử lý trong trường hợp không có điều kiện WHEN nào thỏa mãn (false)

END: Indicates the end of the CASE loop.

END là kết thúc, kết thúc CASE

Từ khóa thì chỉ có 5 cái vậy, mà vẫn khó hiểu nên mình quay lại ví dụ SQL ở phần 1 ha. Diễn giải theo cách dễ hiểu hơn (kiểu ngôn ngữ tự nhiên).

LẤY TinhThanh,
TRƯỜNG HỢP 
	KHI 
    	TinhThanh = "HCM" 
    THÌ 
    	"Ho Chi Minh"
    KHI 
    	TinhThanh = "DN" 
    THÌ "Da Nang"
    
KHÁC THÌ TinhThanh
KẾT THÚC AS "Cap Nhat Thanh Pho" 

LẤY TỪ BanBe

Cách này thì Case When trong SQL tự nhiên trở nên dễ hiểu hơn rất nhiều. Dễ hơn vạn lần cho những bạn mới tiếp cận với SQL.

Kết thúc phần một, hiểu để sử dụng được case when trong sql. Tiếp đến là nó hoạt động như thế nào?, thú vị hơn nha.

2. Ví dụ cụ thể với Database postgres

Sau khi đã tìm hiểu qua mục 1, anh em chắc hẳn sẽ tự tin vỗ ngữ là: Ối dồi ôi, dăm ba cái Case When này, dễ hiểu ấy mà, tương tự như If Else.

Uầy, thì đúng là xài dễ, nhưng cụ thể cho dễ mường tượng thì vẫn tốt hơn. Mình ví dụ dưới đây với hệ cơ sở dữ liệu postgres.

Yêu cầu là với news_type (loại tin tức), hiện tại trong các bảng đang lưu là id (là số), nếu không có bảng master quy định các thông tin này thì để lấy ra được nội dung dễ đọc, ta cần sử dụng case when trong sql.

Nếu news_type=4 loại hình này là Chung Cư (ví dụ thôi nha), nếu khác 4 là loại hình đất nền, column mình lấy ra là loainhadat.

Dưới đây là trường hợp case, anh em thấy trong 5 row lấy ra chỉ có dòng cuối cùng là thỏa điều kiện

Case when trong sql

Kết quả là chỉ có row số 5 là Chung Cu, 4 row phía trên là Dat nen.

4 case phía trước do news_type không bằng 4 nên sẽ lọt vào case ELSE -> dẫn tới kết quả là 4 row phía trên ‘Dat nen’.

Case when trong sql

Ví dụ cụ thể sinh động như cá bơi trong chậu rồi nha, giờ tới một số lưu ý khi sử dụng SQL.

3. Một số lưu ý khi sử dụng Case When trong SQL

3.1 Kiểu dữ liệu

Cái này anh em khi mới bắt đầu sử dụng Case When trong SQL thường gặp lỗi này. Việc so sánh sai kiểu dữ liệu dẫn với Case when không work như cách mà anh em mong muốn.

Nếu so sánh sai kiểu dữ liệu, ở một số hệ cơ sở dữ liệu còn trả về “Invalid Input Syntax”.

Ví dụ trường hợp phía dưới đây cột Name có kiểu dữ liệu là VARCHAR (ký tự).

SELECT Track.Name, Track.GenreId,
CASE WHEN (Track.Name = 40) THEN 'Rock'
END AS Genre FROM Track
ORDER BY Track.Name ASC LIMIT 10;

Anh em chú ý khúc CASE WHEN (Track.Name = 40), 40 ở đây đang là số. Trường hợp execute sẽ dẫn tới lỗi.

ERROR: operator does not exist: character varying = integer 

Nên trước khi viết case when so sánh cột nào anh em nên mở bảng đó ra xem kiểu dữ liệu trước khi thực hiện chạy SQL nha.

3.2 Nhiều case when trong SQL

Trường hợp có nhiều Case When, ta lưu ý rằng:

  • After THEN is executed, CASE will return to the top of the loop and begin checking the next entry.
  • If the condition is false, the next WHEN statement will be evaluated.

Sau khi mà CASE WHEN đã true – đúng, CASE sẽ trở lại đầu vòng lặp và check tiếp row sau, bất kể phía dưới còn bao nhiêu SQL. Cái này anh em lưu ý.

Thứ hai là nếu WHEN đã sai – fasle, CASE lúc này sẽ di chuyển tới CASE tiếp theo, chỗ này có thể ảnh hưởng tới performance nếu có quá nhiều CASE WHEN cần kiểm tra.

3.3 Không có else

Một số anh em viết case when trong sql hay miss trường hợp else.

If no ELSE statement is present and all WHEN conditions are false, the returned value will be NULL. Nếu trường hợp không có ELSE và tất cả các điều kiện WHEN đều false (tức là không match) cái nào

4. Tổng kết để khỏi quên ha

  • CASE WHEN được sử dụng để xác định các câu lệnh điều kiện trong SQL CASE khai báo sự bắt đầu của các điều kiện
  • WHEN khai báo điều kiện
  • THEN khai báo thứ trả về khi điều kiện WHEN là true
  • ELSE bắt tất cả các trường hợp không pass ở WHEN
  • END kết thúc cho CASE
  • Ta có thể có nhiều WHEN trong một CASE nha
  • AS sử dụng để định nghĩa name của cột trả về, nếu không có thì default là “case”

Kết bài bằng một trò đùa zui zẻ nha anh em. Đừng viết SQL kiểu này không có ông nào sau đi maintain ổng kiếm tới tận nhà lun á.

example of writing sql

5. Tham khảo

  • SQL CASE Statement – W3School: https://www.w3schools.com/sql/sql_case.asp
  • How CASE WHEN Works – The Data School: https://dataschool.com/how-to-teach-people-sql/how-case-when-works/
  • CASE statement in SQL: https://www.sqlshack.com/case-statement-in-sql/

Cảm ơn vì đã đọc bài – Thank for you time – Happy coding!

Tác giả: Kiên Nguyễn

Xem thêm bài viết:

Loạt IT Jobs hot trên TopDev đang chờ bạn ứng tuyển!