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

SQLAlchemy func.count trên cột boolean

Sử dụng các hàm tổng hợp trong một HAVING điều khoản này rất hợp pháp, vì HAVING loại bỏ hàng nhóm. Đếm có điều kiện có thể đạt được bằng cách sử dụng thuộc tính NULL không tính:

count(expression) ... số hàng đầu vào mà giá trị của biểu thức không phải là giá trị rỗng

hoặc nếu sử dụng PostgreSQL 9.4 trở lên, với FILTER tổng hợp mệnh đề:

count(*) FILTER (WHERE something > 0)

Bạn cũng có thể sử dụng tổng các số một (và các số không).

PostgreSQL> =9.4 và SQLAlchemy> =1.0.0

Sử dụng hàm tổng hợp đã lọc:

.having(func.count(1).filter(Question.accepted) >
        func.count(1).filter(not_(Question.accepted)))

PostgreSQL cũ hơn và / hoặc SQLAlchemy

Tương tự SQL cho "if" là CASE biểu thức hoặc trong trường hợp này là nullif() hàm số. Cả hai đều có thể được sử dụng cùng với thực tế là NULL không tính:

from sqlalchemy import case

...

.having(func.count(case([(Question.accepted, 1)])) >
        func.count(case([(not_(Question.accepted), 1)])))

hoặc:

.having(func.count(func.nullif(Question.accepted, False)) >
        func.count(func.nullif(Question.accepted, True)))

Sử dụng nullif() có thể hơi khó hiểu vì "điều kiện" là điều bạn không muốn đếm. Bạn có thể thiết bị một biểu thức để làm cho điều kiện tự nhiên hơn, nhưng điều đó được để lại cho người đọc. 2 giải pháp này là các giải pháp di động hơn, nhưng mặt khác là FILTER mệnh đề là tiêu chuẩn, mặc dù không được phổ biến rộng rãi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm truy vấn động Postgres

  2. Cách bỏ nhiều bảng trong PostgreSQL bằng ký tự đại diện

  3. Làm cách nào để khởi động máy chủ PostgreSQL trên Mac OS X?

  4. Liệt kê các hàm được lưu trữ tham chiếu đến một bảng trong PostgreSQL

  5. Postgres:Thêm ràng buộc nếu nó chưa tồn tại