Chuyển đến nội dung chính
Mô-đun 4 · Bài học 3 trong tổng số 415/57 trong khóa học~10 min
Bài học theo mô-đun (3/4)

Logic có điều kiện: TRƯỜNG HỢP KHI

Mọi thứ chúng ta đã thấy cho đến nay đều trích xuất dữ liệu nguyên trạng. Tuy nhiên, thường thì bạn muốn để chuyển đổi nó: phân loại tiền lương thành các bậc, đánh dấu những người mới tuyển dụng là "Junior", dịch mã số thành nhãn có thể đọc được. tiêu chuẩn của SQL công cụ cho việc này được gọi là CASE WHEN.

Cú pháp: một if/else nhỏ

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

Nó đọc chính xác như if/else if/else trong bất kỳ ngôn ngữ nào: SQL đánh giá các điều kiện theo thứ tự và dừng ở điều kiện đúng đầu tiên, trả về tương ứng value. Nếu không đúng thì nó sẽ trả về giá trị ELSE. Nếu bạn bỏ qua ELSE và không có nhánh nào khớp, nó sẽ trả về NULL.

SQL
-- Classify employees by salary tier:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

CASE nằm bên trong SELECT: nó tạo ra một cột giống như bất kỳ cột nào và việc đặt bí danh bằng AS là điều hoàn toàn bình thường (ở đây tier).

Sử dụng CASE ở đâu

Ba địa điểm định kỳ:

  1. Trong SELECT để tạo các cột dẫn xuất (ví dụ ở trên).
  2. Trong ORDER BY để sắp xếp "tùy chỉnh":
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. Bên trong các hàm tổng hợp để "đếm có điều kiện":
    SQL
    SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior,
      SUM(CASE WHEN salary <  35000 THEN 1 ELSE 0 END) AS junior
    FROM employees;
    Mẫu này — SUM(CASE WHEN … THEN 1 ELSE 0 END) — là mẫu phổ biến nhất "số có điều kiện" được sử dụng trong trang tổng quan.

Hình thức "cô đọng"

Ngoài ra còn có một biến thể ngắn hơn khi bạn so sánh một biểu thức chống lại các giá trị chính xác:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

Nó tương đương với CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, chỉ nhỏ gọn hơn. Nó chỉ hoạt động với sự bình đẳng chính xác: nếu bạn cần >= hoặc một so sánh khác, bạn phải quay lại phần mở rộng hình thức.

Hãy thử nó

tập thể dục#sql.m4.l3.e1
Nỗ lực: 0Đang tải…

Đối với mỗi nhân viên, hãy hiển thị tên (first_name), họ (last_name) và cột 'cấp' là 'Alto' nếu mức lương ít nhất là 50000, nếu không thì là 'Tiêu chuẩn'. Ba cột, một hàng cho mỗi nhân viên.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Điều kiện là lương >= 50000. Hãy nhớ đóng CASE bằng END và sử dụng bí danh 'tier'.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m4.l3.e2
Nỗ lực: 0Đang tải…

Đối với mỗi bộ phận (department_id), hãy đếm xem có bao nhiêu nhân viên có mức lương cao (>= 50000) và bao nhiêu nhân viên có mức lương tiêu chuẩn (< 50000) bằng cách sử dụng SUM(CASE...). Ba cột: Department_id, cao, tiêu chuẩn. Đặt hàng theo bộ phận_id (NULLS CUỐI CÙNG).

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Mẫu SUM(CASE WHEN ... THEN 1 ELSE 0 END) là số đếm có điều kiện.

Giải pháp khả dụng sau 3 lần thử