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á.