Hướng dẫn case when mysql

Tìm hiểu lệnh CASE trong MySQL

1] Chức năng & cách sử dụng

- Trong hệ quản trị cơ sở dữ liệu MySQL, lệnh CASE được dùng để tạo ra những giá trị khác nhau dựa trên những điều kiện khác nhau.

- Dưới đây là cú pháp sử dụng lệnh CASE:

CASE WHEN condition1 THEN result1; WHEN condition2 THEN result2; WHEN conditionN THEN resultN; ELSE result; END

- Khi lệnh CASE được thực thi, nó sẽ kiểm tra lần lượt các điều kiện [theo thứ tự từ trên xuống], nếu phát hiện được điều kiện đúng thì nó sẽ kết thúc việc kiểm tra & trả về giá trị nằm tại điều kiện đó.

- Lưu ý:

  • Nếu không có điều kiện nào đúng thì lệnh CASE sẽ trả về giá trị tại mệnh đề ELSE.
  • Nếu không có điều kiện nào đúng & không có mệnh đề ELSE thì lệnh CASE sẽ trả về giá trị NULL.

2] Tham khảo một số ví dụ

- Trong bài học này, tôi sẽ sử dụng cái bảng Student như bên dưới để làm một số ví dụ minh họa.

ID FullName Gender Age City
1 Nguyễn Thành Nhân Nam 22 Cần Thơ
2 Dương Văn Gánh Nam 19 Sóc Trăng
3 Trần Thanh Trúc Nữ 27 Hải Phòng
4 Châu Tinh Trì Nam 20 Cần Thơ
5 Lê Thị Huỳnh Như Nữ 24 Bạc Liêu
6 Tì Sa Môn Thiên Nam 21 Hậu Giang
7 Doãn Chí Bình Nam 26 Cần Thơ
8 Phạm Thị Thu Hiền Nữ 18 Vĩnh Long

- Liệt kê tên, tuổi, nhóm độ tuổi của tất cả các sinh viên.

  • Nếu sinh viên có tuổi lớn hơn 20 thì nhóm độ tuổi sẽ ghi là "Lớn hơn 20 tuổi"
  • Nếu sinh viên có tuổi bằng 20 thì nhóm độ tuổi sẽ ghi là "Bằng 20 tuổi"
  • Nếu sinh viên có tuổi nằm ngoài hai trường hợp trên thì nhóm độ tuổi sẽ ghi là "Nhỏ hơn 20 tuổi"
SELECT FullName, Age,
CASE
	WHEN Age > 20 THEN "Lớn hơn 20 tuổi"
	WHEN Age = 20 THEN "Bằng 20 tuổi"
	ELSE "Nhỏ hơn 20 tuổi"
END AS AgeGroup
FROM Student;

- Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:

FullName Age AgeGroup
Nguyễn Thành Nhân 22 Lớn hơn 20 tuổi
Dương Văn Gánh 19 Nhỏ hơn 20 tuổi
Trần Thanh Trúc 27 Lớn hơn 20 tuổi
Châu Tinh Trì 20 Bằng 20 tuổi
Lê Thị Huỳnh Như 24 Lớn hơn 20 tuổi
Tì Sa Môn Thiên 21 Lớn hơn 20 tuổi
Doãn Chí Bình 26 Lớn hơn 20 tuổi
Phạm Thị Thu Hiền 18 Nhỏ hơn 20 tuổi

- Liệt kê thông tin của tất cả các sinh viên.

- Lưu ý: Nếu biểu thức [4 + 10] > 15 là đúng thì sắp xếp thứ tự các sinh viên theo độ tuổi, còn nếu sai thì sắp xếp thứ tự các sinh viên theo giới tính.

SELECT *
FROM Student
ORDER BY
[CASE
	WHEN [4+10] > 15 THEN Age
	ELSE Gender
END];

- Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:

ID FullName Gender Age City
1 Nguyễn Thành Nhân Nam 22 Cần Thơ
2 Dương Văn Gánh Nam 19 Sóc Trăng
4 Châu Tinh Trì Nam 20 Cần Thơ
6 Tì Sa Môn Thiên Nam 21 Hậu Giang
7 Doãn Chí Bình Nam 26 Cần Thơ
3 Trần Thanh Trúc Nữ 27 Hải Phòng
5 Lê Thị Huỳnh Như Nữ 24 Bạc Liêu
8 Phạm Thị Thu Hiền Nữ 18 Vĩnh Long

Bài viết được sự cho phép của tác giả Nguyễn Văn Minh

Bạn đã bao giờ tự hỏi: Trong MySQL, câu lệnh CASE, câu lệnh IF và hàm IF khác nhau thế nào? Bạn có thấy phân vân khi chọn một trong ba thứ trên để viết query? Đây không phải câu hỏi mới nhưng nhiều bạn sẽ bỡ ngỡ khi tiếp xúc với nó. Nhất là khi bạn vừa bắt đầu tìm hiểu về MySQL và cơ sở dữ liệu quan hệ.

Nếu bạn muốn tìm hiểu cơ sở dữ liệu là gì và có những loại nào, hãy tham khảo bài viết này.

Cú pháp

Câu lệnh CASE

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

Câu lệnh IF

IF condition1 THEN
   {...statements to execute when condition1 is TRUE...}

[ ELSEIF condition2 THEN
   {...statements to execute when condition1 is FALSE and condition2 is TRUE...} ]

[ ELSE
   {...statements to execute when both condition1 and condition2 are FALSE...} ]

END IF;

Hàm IF

IF[expr1,expr2,expr3]

Đào sâu hơn

Nhìn vào cú pháp trên đây, ta có thể thấy, dường như hàm IF ít linh hoạt hơn câu lệnh CASE. Nếu bạn viết thế này:

SELECT IF[movie = 'The Matrix', 'high', 'low'] AS suggestion

Thì bạn hoàn toàn có thể dùng CASE như thế này:

SELECT CASE WHEN movie = 'The Matrix' THEN 'high' ELSE 'low' END AS suggestion

Khá là giống nhau đúng không? Trừ việc hàm IF trông gọn gàng hơn chút ít. Nhưng nếu có nhiều hơn hai nhánh thì sao? Có lẽ bạn sẽ không muốn viết thế này:

SELECT IF[movie = 'The Matrix', 'high', IF[movie = 'Endgame', 'medium', 'low']] AS suggestion

Mà nên là thế này:

SELECT CASE movie 
    WHEN = 'The Matrix' THEN 'high'
    WHEN = 'Endgame'    THEN 'medium'
    ELSE 'low'
END AS suggestion

Nó cũng tương tự như khi ta dùng switch để rẽ nhánh vậy, tự nhiên vào thoải mái hơn rất nhiều.

Có một điều bạn phải chú ý. Trong khi câu lệnh CASE là câu lệnh chuẩn của SQL thì hàm IF lại hoàn toàn không phải. Điều đó có nghĩa gì? Nếu bạn có ý định chuyển sang dùng SQL Server hay PostgreSQL chẳng hạn, hàm IF sẽ không còn hoạt động nữa.

Ở một diễn biến khác, câu lệnh IF là cái gì đó rất lạ lẫm với hai thứ trên. Nó được dùng khi viết thủ tục [procedure]. Ví dụ:

CREATE FUNCTION get_suggestion [movie varchar[50]]
RETURNS varchar[20]
BEGIN
   IF movie = 'The Matrix' THEN
      return 'high';
   ELSEIF movie = 'Endgame' THEN
      return 'medium';
   ELSE
     return 'low';
   END IF;
END;

Do đó, chớ nên nhầm lẫn mục đích sử dụng của câu lệnh IF với hàm IF, hay thậm chí câu lệnh CASE. Chúng sinh ra vì những “sứ mệnh” khác nhau.

Chủ Đề