Verzamelfuncties gebruiken in een HAVING
clausule is zeer legaal, aangezien HAVING
elimineert groepsrijen. Voorwaardelijk tellen kan worden bereikt door gebruik te maken van de eigenschap die NULL
s tellen niet mee:
count(expression)
... aantal invoerrijen waarvoor de waarde van expressie niet null is
of bij gebruik van PostgreSQL 9.4 of hoger, met het geaggregeerde FILTER
clausule:
count(*) FILTER (WHERE something > 0)
U kunt ook een som van enen (en nullen) gebruiken.
PostgreSQL>=9.4 en SQLAlchemy>=1.0.0
Een gefilterde aggregatiefunctie gebruiken:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
Oudere PostgreSQL en/of SQLAlchemy
De SQL-analoog voor "if" is ofwel CASE
expressie of in dit geval nullif()
functie. Beide kunnen samen worden gebruikt met het feit dat NULL
s tellen niet mee:
from sqlalchemy import case
...
.having(func.count(case([(Question.accepted, 1)])) >
func.count(case([(not_(Question.accepted), 1)])))
of:
.having(func.count(func.nullif(Question.accepted, False)) >
func.count(func.nullif(Question.accepted, True)))
nullif()
gebruiken kan een beetje verwarrend zijn omdat de "conditie" is wat je niet wil tellen. Je zou een uitdrukking kunnen gebruiken die de toestand natuurlijker zou maken, maar dat wordt overgelaten aan de lezer. Deze 2 zijn meer draagbare oplossingen, maar aan de andere kant is de FILTER
clausule is standaard, maar niet algemeen beschikbaar.