01/10/2018, 16:40

Bài 20: Câu lệnh CASE trong MySQL

Trong MySQL mệnh đề CASE được chia làm hai định dạng. Chức năng CASE đơn giản hay còn gọi là Simple CASE Chức năng CASE tìm kiếm hay còn gọi là Searched CASE Trong đó : Simple CASE là so sánh một biểu thức với một bộ các biểu thức đơn giản để xác định kết quả. Searched CASE là ...

Trong MySQL mệnh đề CASE được chia làm hai định dạng.

  • Chức năng CASE đơn giản hay còn gọi là Simple CASE
  • Chức năng CASE tìm kiếm hay còn gọi là Searched CASE

Trong đó:

  • Simple CASE là so sánh một biểu thức với một bộ các biểu thức đơn giản để xác định kết quả.
  • Searched CASE là đánh giá một bộ các biểu thức Boolean để xác định kết quả

Cả 2 định dạng trên đều hỗ trợ đối số ELSE (nhưng không bắt buộc)

1. Cú pháp Simple CASE

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

2. Cú pháp Searched CASE

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

Trong đó:

  • case_value: là một biểu thức đánh giá khi sử dụng định dạng Simple CASE, case_value là bất cứ biểu thức SQL nào, miễn là hợp lệ
  • when_value: là biểu thức đơn giản dùng để so sánh với biểu thức case_value khi sử dụng định dạng Simple CASE. when_value là một biểu thức SQL bất kỳ miễn là hợp lệ. Kiểu dữ liệu của 2 biểu thức: case_value và when_value phải giống nhau, nếu không giống nhau thì đổi về cùng một kiểu dữ liệu, có thể dùng các hàm chuyển đổi như CAST, …
  • statement_list: là kết quả biểu thức trả về khi case_value = when_value trong Simple CASE, hoặc khi search_condition = TRUE trong Searched CASE. result_expression là một biểu thức SQL bất kỳ miễn là hợp lệ.
  • ELSE statement_list: là biểu thức kết quả trả về khi case_value không thỏa bất cứ when_value trong Simple CASE, hoặc khi tất cả search_condition trả về FALSE trong Searched CASE.
  • search_condition: là một biểu thức điều kiện trả về kiểu boolean (TRUE hoặc FALSE) được sử dụng trong Searched CASE. search_condition là bất kỳ biểu thức Boolean nào miễn là hợp lệ.
  • END: là từ khóa dùng để đóng CASE lại

Nếu bạn đã lắm rõ lệnh switch..case trong PHP thì bạn hoàn toàn có thể sử dụng nhuần nhuyễn cú pháp lệnh CASE trong MySQL.

Chúng ta sẽ đi qua một vài ví dụ để hiểu rõ hơn về câu lệnh này.

1. Ví dụ Simple CASE.

Dựa vào gender trong bảng customer để hiện thị giới tính cho các khách hàng.

  • Nếu gender = 0 ->  Hiển thị Female(Nữ)
  • Nếu gender = 1 -> Hiển thị Male(Nam)
  • Nếu gender = 2 -> Hiển thị Other(Khác)
SELECT 
      customerName,gender,phone,city,postalCode
FROM customers
WHERE country='USA'

Try In Out

Áp dụng lệnh CASE vào câu truy vấn.

SELECT 
      customerName,
	 (CASE gender
	   	WHEN '0' THEN 'Female'
	   	WHEN '1' THEN 'Male'
	   	ELSE 'Other'
	  	END
	  ) as Gender
	  ,phone,city,postalCode
FROM customers
WHERE country='USA'

Try In Out

2. Ví dụ Searched CASE.

Dựa vào buyPrice trong bảng products để xếp loại mức giá theo tiêu chí sau.

  • Nếu buyPrice >= 100$ giá cao.
  • Nếu buyPrice >= 50$ giá Trung bình.
  • Nếu buyPrice < 30$ giá Thấp.
SELECT
	productCode,productName,quantityInStock,buyPrice
FROM products

Try In Out

SELECT
	productCode,productName,quantityInStock,buyPrice,
	CASE 
		WHEN buyPrice >= 100 THEN 'Cao'
		WHEN buyPrice >= 50 THEN 'TB'
		ELSE 'Thấp'
	END AS 'Level'
FROM products

Try In Out

Thêm một chút nữa là bạn hoàn toàn có thể đưa nhiều điều kiện vào search_condition sử dụng các toán tử logic như AND,OR

SELECT
	productCode,productName,quantityInStock,buyPrice,
	CASE 
		WHEN buyPrice >= 100 THEN 'Cao'
		WHEN buyPrice >= 50 AND buyPrice < 80 THEN 'Dưới TB'
		WHEN buyPrice >= 80 AND buyPrice < 100 THEN 'Trên TB'
		ELSE 'Thấp'
	END AS 'Level'
FROM products

Try In Out

Tổng kết.

Trong bài viết này mình đã ôn lại cho các bạn sử dụng lệnh CASE trong MySQL. Thực ra thì nó cũng khá đơn giản và cũng khá tương đồng với cú pháp lênh switch..case trong PHP. Hy vọng qua bài viết này bạn sẽ hiểu và sử dụng nó một cách linh hoạt trong các câu truy vấn của mình.

Trần Trung Dũng

15 chủ đề

2610 bài viết

Cùng chủ đề
0