Chuyển đến nội dung chính

Câu lệnh CASE trong PostgreSQL

Trong hướng dẫn này, bạn sẽ học cách viết các truy vấn điều kiện trong PostgreSQL bằng biểu thức điều kiện CASE của PostgreSQL.
Đã cập nhật 5 thg 10, 2026  · 7 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Các biểu thức điều kiện là một trong những yếu tố nền tảng của bất kỳ mô hình lập trình nào. Những biểu thức điều kiện thường gặp gồm các khối if-else và các trường hợp switch. Bạn có thể xây dựng biểu thức điều kiện trong PostgreSQL bằng câu lệnh WHEN-THEN, rất giống với các khối if-else. Trong hướng dẫn này, bạn sẽ học cách thực hiện điều đó.

Trước khi bắt đầu viết các truy vấn điều kiện, điều quan trọng là bạn thiết lập một cơ sở dữ liệu PostgreSQL cục bộ. Bạn sẽ làm điều này trong phần đầu tiên của hướng dẫn.

Lưu ý: Để theo dõi hướng dẫn này, bạn cần nắm được những kiến thức cơ bản về SQL và PostgreSQL. Bạn có thể ôn lại phần cơ bản với các tài nguyên sau:

Thiết lập cơ sở dữ liệu PostgreSQL cục bộ

Để thiết lập cơ sở dữ liệu, bạn có thể làm theo bài viết này. Sau khi khôi phục bản sao lưu thành công, bạn sẽ thấy các bảng sau trong cơ sở dữ liệu:

  • countries
  • route_table
  • station_table
  • train_table

Tuy nhiên, hướng dẫn này chỉ sử dụng bảng countries. Bạn có thể thoải mái khám phá các bảng có trong bản sao lưu cơ sở dữ liệu. Ngoài ra, bạn có thể muốn tạo cơ sở dữ liệu và bảng của riêng mình. Nếu bạn đã khôi phục bản sao lưu, đến giờ bạn nên có một bảng (chứa thông tin về các quốc gia khác nhau trên thế giới). Giờ hãy lướt qua bảng countries thật ngắn gọn.

Khám phá nhanh bảng countries

Sau khi khôi phục cơ sở dữ liệu, bạn có thể xem bảng trong giao diện pgAdmin đi kèm với cài đặt mặc định của PostgreSQL. Khi chạy một câu lệnh SELECT đơn giản, bạn sẽ biết về các cột, kiểu dữ liệu của chúng và cả các hàng mà bảng đang chứa -

database

Bảng chứa thông tin về tổng cộng 206 quốc gia khác nhau từ nhiều khu vực trên thế giới. Vậy chính xác là bao nhiêu khu vực? Truy vấn dưới đây sẽ cho bạn câu trả lời.

SELECT COUNT(DISTINCT(region)) from countries;

Kết quả cho thấy có 23 khu vực khác nhau trong bảng này, như Tây Âu, Polynesia, Trung Đông, v.v. Bạn có thể tự đặt ra các câu hỏi nhanh để khám phá bảng, và trong quá trình đó có thể phát hiện những điều thú vị. Giờ hãy tìm hiểu cấu trúc của một CASE cơ bản trong PostgreSQL.

Giới thiệu về CASE trong PostgreSQL

Dưới đây là dạng tổng quát của một câu lệnh case trong PostgreSQL với cấu trúc WHEN-THEN -

CASE
     WHEN condition_1  THEN result_1
     WHEN condition_2  THEN result_2
     ...
     ELSE  result_n
END

Dưới đây là một số điểm quan trọng bạn cần lưu ý khi xây dựng các CASE trong PostgreSQL:

  • Mỗi điều kiện là một biểu thức boolean và dựa trên đầu ra của nó để chọn kết quả. Nếu tất cả các biểu thức tương ứng với WHEN đều được đánh giá là False, thì kết quả ở phần ELSE sẽ được hiển thị. Trường hợp bạn không chỉ định phần ELSE, truy vấn sẽ trả về null.

  • Một điều kiện thường được áp dụng lên một cột có trong bảng bạn đang thao tác. Các cấu trúc truy vấn điều kiện như trên thường được dùng với câu lệnh SELECT. Lưu ý rằng cột mà bạn dùng để chỉ định các biểu thức boolean (trong CASE) phải có trong câu lệnh SELECT của truy vấn. Nhưng khi bạn dùng CASE cùng với mệnh đề where, bạn không nhất thiết phải tuân theo điều này (sẽ nói thêm ở phần sau).

  • Kiểu dữ liệu của các kết quả phải đồng nhất. Bạn không thể trả về một string ở result_1 và một integer ở result_2, v.v.

Giờ hãy đi vào một số ví dụ.

Viết các CASE trong PostgreSQL

Hãy bắt đầu đơn giản. Bây giờ bạn sẽ viết một CASE để nhóm các quốc gia theo năm độc lập. Năm độc lập được ghi trong cột indep_year. Giả sử bạn có ba nhóm năm độc lập của các quốc gia cần theo. Bạn sẽ tạo ba nhóm năm độc lập như sau -

  • Trước năm 1900 (indep_year < 1900)
  • Từ 1900 đến 1930 (indep_year <= 1930)
  • Sau năm 1930 (indep_year > 1930)

Kết quả cuối cùng của truy vấn sẽ chứa các cột sau -

  • name (tên quốc gia)
  • continent (châu lục của quốc gia)
  • indep_year
  • Và nhóm năm độc lập mà bạn sẽ tạo. Hãy đặt tên là indep_year_group.

Giờ hãy viết truy vấn -

SELECT name, continent, indep_year,
    CASE WHEN indep_year < 1900 THEN 'before 1900'
         WHEN indep_year <= 1930 THEN 'between 1900 and 1930'
         ELSE 'after 1930' END
         AS indep_year_group
FROM countries
ORDER BY indep_year_group;

(Truy vấn này lấy cảm hứng từ khóa học Joining Data in SQL của DataCamp.)

Sau khi chạy truy vấn, bạn sẽ thấy nhiều quốc gia như Palestine, Puerto Rico, v.v. không có năm độc lập trong bảng. Do đó, chúng được xếp vào nhóm between 1900 and 1930.

Các CASE trong PostgreSQL có thể có nhiều điều kiện. Có một vài bản ghi trong bảng mà tên quốc gia và thủ đô trùng nhau. Bạn có thể thêm điều kiện này vào CASE đã xây dựng trước đó -

SELECT name, continent, indep_year,
    CASE WHEN (indep_year < 1900) AND (countries.name = countries.capital) THEN 'before 1900 and capital same'
         WHEN indep_year <= 1930 AND (countries.name = countries.capital) THEN 'between 1900 and 1930 and capital same'
         ELSE 'after 1930_and_no_same_capital' END
         AS indep_year_group
FROM countries
ORDER BY indep_year_group;

Một điểm thú vị khác về CASE là bạn có thể kết hợp chúng với các hàm tổng hợp như SUM(). Để triển khai một CASE với hàm tổng hợp SUM(), bạn sẽ cần một bảng khác phù hợp với ý tưởng này. Hãy tạo một bảng đơn giản tên student_grades với các cột và kiểu dữ liệu sau -

  • student_name (chuỗi)
  • student_stream (chuỗi)
  • student_grade (ký tự)

Truy vấn sau sẽ tạo bảng cho bạn -

CREATE TABLE student_grades
(student_name character varying,
student_stream character varying,
student_grade character);

Giờ hãy chèn một số bản ghi vào bảng. Bạn có thể làm điều này bằng vài câu lệnh INSERT. Giả sử sau khi chèn, bảng student_grades có các bản ghi như sau -

table

Bây giờ, bạn sẽ viết một CASE để tính tổng số học sinh thuộc các nhóm điểm nhất định. Như bạn thấy, theo các bản ghi trong bảng, có ba điểm khác nhau - A, B và C. Truy vấn điều kiện nên trả về kết quả tương tự như sau -

table

Truy vấn cho việc này -

SELECT
 SUM (
 CASE
 WHEN student_grade = 'A' THEN
 1
 ELSE
 0
 END
 ) AS "High Scoring",
 SUM (
 CASE
 WHEN student_grade = 'B' THEN
 1
 ELSE
 0
 END
 ) AS "Mid Scoring",
 SUM (
 CASE
 WHEN student_grade = 'C' THEN
 1
 ELSE
 0
 END
 ) AS "Low Scoring"
FROM
 student_grades;

Đây là cách bạn có thể kết hợp CASE với các hàm tổng hợp để rút ra những thông tin thú vị về dữ liệu.

Kết luận và đọc thêm

Đó là tất cả cho hướng dẫn này. Trong hướng dẫn này, bạn đã học cách đưa điều kiện kiểu if-then vào các truy vấn SQL để tạo ra các báo cáo thú vị. Bạn đã thực hành qua một số ví dụ để củng cố kỹ năng này. Nếu bạn muốn có các bài tập thử thách hơn, bạn nên học các khóa SQL sau của DataCamp -

Bạn có thể để lại câu hỏi về hướng dẫn này trong phần Comments.

Chủ đề
SQL
Khoa học Dữ liệu

Khóa học SQL

Khóa học

Xử lý dữ liệu trong SQL

4 giờ
338.8K
Thành thạo truy vấn SQL phức tạp để giải đáp nhiều câu hỏi về Khoa học dữ liệu và chuẩn bị bộ dữ liệu đáng tin cậy để phân tích trong PostgreSQL.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm