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.