Menggunakan fungsi agregat dalam HAVING
klausa sangat legal, karena HAVING
menghilangkan baris grup. Penghitungan bersyarat dapat dicapai baik dengan menggunakan properti yang NULL
s tidak dihitung:
count(expression)
... jumlah baris input yang nilai ekspresinya bukan null
atau jika menggunakan PostgreSQL 9.4 atau lebih baru, dengan agregat FILTER
klausa:
count(*) FILTER (WHERE something > 0)
Anda juga dapat menggunakan jumlah satu (dan nol).
PostgreSQL>=9.4 dan SQLAlchemy>=1.0.0
Menggunakan fungsi agregat yang difilter:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
PostgreSQL dan/atau SQLAlchemy yang lebih lama
Analog SQL untuk "jika" adalah CASE
ekspresi atau dalam hal ini nullif()
fungsi. Keduanya dapat digunakan bersama dengan fakta bahwa NULL
s tidak dihitung:
from sqlalchemy import case
...
.having(func.count(case([(Question.accepted, 1)])) >
func.count(case([(not_(Question.accepted), 1)])))
atau:
.having(func.count(func.nullif(Question.accepted, False)) >
func.count(func.nullif(Question.accepted, True)))
Menggunakan nullif()
bisa sedikit membingungkan karena "kondisi" adalah yang tidak ingin menghitung. Anda dapat memasang ekspresi yang akan membuat kondisi lebih alami, tetapi itu diserahkan kepada pembaca. 2 ini adalah solusi yang lebih portabel, tetapi di sisi lain FILTER
klausa adalah standar, meskipun tidak tersedia secara luas.