Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách viết câu lệnh CASE trong SQL

Vấn đề:

Bạn muốn sử dụng câu lệnh CASE trong SQL.

Ví dụ:

Bạn có kết quả kiểm tra trong exam bàn. Bạn cần chỉ định mỗi kết quả cho một trong các giá trị văn bản sau:'bad result' , 'average result' hoặc 'good result' . Kết quả xấu là những kết quả dưới 40, kết quả tốt là trên 70 và phần còn lại là kết quả trung bình.

exam bảng trông như thế này:

name kết quả
Toby Shaw 56
Casey Watson 49
Bennie Lynn 23
Lane Sloan 70
Steff Fox 85
Reggie Ward 40
Gail Kennedy 66
Brice Mueller 90

Giải pháp 1:

SELECT
  name,
  result,
  CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result > 70 THEN 'good result'
    ELSE 'average result'
  END AS category
FROM exam;

Bảng kết quả trông như thế này:

name kết quả loại
Toby Shaw 56 kết quả trung bình
Casey Watson 49 kết quả trung bình
Bennie Lynn 23 kết quả không tốt
Lane Sloan 70 kết quả trung bình
Steff Fox 85 kết quả tốt
Reggie Ward 40 kết quả trung bình
Gail Kennedy 66 kết quả trung bình
Brice Mueller 90 kết quả tốt

Thảo luận:

Để hiển thị giá trị dựa trên (các) điều kiện cụ thể của bạn, bạn cần viết CASE tuyên bố. Cú pháp là:

CASE
  WHEN  THEN ,
  WHEN  THEN ,
  …
  ELSE 
END AS 

Nếu condition_1 được đáp ứng, khi đó giá trị được truy xuất là value_1 . Nếu không, thì cơ sở dữ liệu sẽ kiểm tra condition_2 . Nếu condition_2 là true, khi đó giá trị được truy xuất là value_2 . Nếu cả hai điều kiện này đều không được đáp ứng, SQL sẽ kiểm tra từng điều kiện còn lại theo thứ tự cho đến khi một trong các điều kiện được đáp ứng. Nếu không có điều kiện nào được đáp ứng, thì value_n được chỉ định sau ELSE được truy xuất.

ELSE một phần là tùy chọn. Nếu bạn bỏ qua nó và không có điều kiện nào được đáp ứng, bạn sẽ nhận được NULL .

Nhớ END CASE mệnh đề khi bạn đã hoàn thành với tất cả các điều kiện. Tất nhiên, như với bất kỳ cột nào bạn tạo, bạn có thể đổi tên nó (AS <column_name> ).

Trong ví dụ của chúng tôi, 'bad result' được chỉ định khi result < 40, and 'good result' được chỉ định khi result > 70 . Nếu cả hai điều kiện này đều không được đáp ứng, giá trị là 'average result' . Ngoài ra, để đặt tên cho cột mới tạo của các giá trị văn bản, bạn cần sử dụng bí danh (AS thể loại). Đây là cách bạn nhận được:

  CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result > 70 THEN 'good result'
    ELSE 'average result'
  END AS category

'average result' được gán cho các kết quả giữa 4070 (bao gồm), bạn cũng có thể viết một điều kiện thay vì ELSE (xem Giải pháp 2 bên dưới). Tuy nhiên, sử dụng ELSE dễ dàng hơn .

Giải pháp 2:

SELECT
  name,
  result,
  CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result > 70 THEN 'good result'
    WHEN result >= 40 AND result <= 70 THEN 'average result'
  END AS category
FROM exam;

Bảng kết quả trông như thế này:

name kết quả loại
Toby Shaw 56 kết quả trung bình
Casey Watson 49 kết quả trung bình
Bennie Lynn 23 kết quả không tốt
Lane Sloan 70 kết quả trung bình
Steff Fox 85 kết quả tốt
Reggie Ward 40 kết quả trung bình
Gail Kennedy 66 kết quả trung bình
Brice Mueller 90 kết quả tốt

Thảo luận:

'average result' được gán cho các kết quả giữa 4070 (bao gồm), bạn có thể viết điều kiện sau thay vì ELSE :

WHEN result >= 40 AND result <= 70 THEN 'average result'

Nếu bạn không sử dụng ELSE và không muốn bất kỳ NULL nào s trong danh mục category , bạn cần đảm bảo rằng bạn quan tâm đến tất cả result có thể có các giá trị. Nếu có result không đáp ứng điều kiện nào, bạn sẽ nhận được NULL .

Giải pháp 3:

SELECT
  name,
  result,
  CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result <= 70 THEN 'average result'
    ELSE 'good result'
  END AS category
FROM exam;

Bảng kết quả trông như thế này:

name kết quả loại
Toby Shaw 56 kết quả trung bình
Casey Watson 49 kết quả trung bình
Bennie Lynn 23 kết quả không tốt
Lane Sloan 70 kết quả trung bình
Steff Fox 85 kết quả tốt
Reggie Ward 40 kết quả trung bình
Gail Kennedy 66 kết quả trung bình
Brice Mueller 90 kết quả tốt

Thảo luận:

Các điều kiện được chỉ định trong CASE có thể không chồng chéo như các giải pháp trước hoặc không chồng chéo như trong giải pháp này. Điều kiện đầu tiên giống như trước - cho result < 40 , category'bad result' . Tất cả kết quả bên dưới 40 được gán giá trị này tại thời điểm này và bạn không cần phải làm gì với chúng nữa. Điều này có nghĩa là không cần đảm bảo result >= 40 trong việc chỉ định các điều kiện cho 'average result' - tất cả các kết quả nhỏ hơn 40 đã có giá trị 'bad result' giao. Cuối cùng, đối với các kết quả còn lại, danh mục phải là 'good result'; một ELSE 'good result' chăm sóc nó. Đây là cách bạn nhận được:

CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result <= 70 THEN 'average result'
    ELSE 'good result'
END AS category

Lưu ý:Thứ tự của các điều kiện trong CASE các vấn đề. Nếu bạn đảo ngược thứ tự của hai điều kiện đầu tiên (tức là nếu bạn chỉ định WHEN result <= 70 THEN 'average result' đầu tiên sau đó đến WHEN result <= 70 THEN 'average result' thứ hai), tất cả các kết quả nhỏ hơn hoặc bằng 70 kết thúc bằng 'average result' danh mục, không có kết quả nào được gán cho 'bad result' danh mục.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lần cuối cùng, KHÔNG, bạn không thể tin tưởng IDENT_CURRENT ()

  2. Tạo một tập hợp hoặc trình tự không có vòng lặp - phần 2

  3. Kích thước cấp chuẩn cho cơ sở dữ liệu Azure SQL mới

  4. Cách sử dụng mệnh đề thu thập số lượng lớn PL / SQL với câu lệnh FETCH INTO

  5. API REST Python với Flask, Connexion và SQLAlchemy - Phần 3