Použití agregačních funkcí v HAVING klauzule je velmi legální, protože HAVING eliminuje skupinové řádky. Podmíněné počítání lze dosáhnout buď pomocí vlastnosti NULL se nepočítají:
count(expression)... počet vstupních řádků, pro které hodnota výrazu není null
nebo pokud používáte PostgreSQL 9.4 nebo novější, s agregovaným FILTER klauzule:
count(*) FILTER (WHERE something > 0)
Můžete také použít součet jedniček (a nul).
PostgreSQL>=9.4 a SQLAlchemy>=1.0.0
Použití filtrované agregační funkce:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
Starší PostgreSQL a/nebo SQLAlchemy
Analog SQL pro "if" je buď CASE výraz nebo v tomto případě nullif() funkce. Obojí lze použít společně s tím, že NULL se nepočítají:
from sqlalchemy import case
...
.having(func.count(case([(Question.accepted, 1)])) >
func.count(case([(not_(Question.accepted), 1)])))
nebo:
.having(func.count(func.nullif(Question.accepted, False)) >
func.count(func.nullif(Question.accepted, True)))
Pomocí nullif() může být trochu matoucí, protože „podmínka“ je to, co neděláte chtít počítat. Můžete použít výraz, který by stav učinil přirozenějším, ale to je ponecháno na čtenáři. Tyto 2 jsou přenosnější řešení, ale na druhé straně FILTER klauzule je standardní, i když není široce dostupná.