Använda aggregerade funktioner i en HAVING
klausul är mycket laglig, eftersom HAVING
eliminerar grupprader. Villkorlig räkning kan uppnås antingen genom att använda egenskapen som NULL
s räknas inte:
count(expression)
... antal inmatningsrader för vilka uttrycksvärdet inte är null
eller om du använder PostgreSQL 9.4 eller senare, med det sammanlagda FILTER
klausul:
count(*) FILTER (WHERE something > 0)
Du kan också använda summan av ettor (och nollor).
PostgreSQL>=9.4 och SQLAlchemy>=1.0.0
Använda en filtrerad aggregatfunktion:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
Äldre PostgreSQL och/eller SQLAlchemy
SQL-analogen för "om" är antingen CASE
uttryck eller i det här fallet nullif()
fungera. Båda kan användas tillsammans med det faktum att NULL
s räknas inte:
from sqlalchemy import case
...
.having(func.count(case([(Question.accepted, 1)])) >
func.count(case([(not_(Question.accepted), 1)])))
eller:
.having(func.count(func.nullif(Question.accepted, False)) >
func.count(func.nullif(Question.accepted, True)))
Använder nullif()
kan vara lite förvirrande eftersom "villkoret" är vad du inte gör vill räkna. Du kan skapa ett uttryck som skulle göra tillståndet mer naturligt, men det överlåts åt läsaren. Dessa 2 är mer portabla lösningar, men å andra sidan FILTER
klausul är standard, men inte allmänt tillgänglig.