Brug af aggregerede funktioner i en HAVING
klausul er meget lovlig, da HAVING
eliminerer grupperækker. Betinget optælling kan opnås enten ved at bruge egenskaben NULL
s tæller ikke:
count(expression)
... antal inputrækker, hvor værdien af udtryk ikke er null
eller hvis du bruger PostgreSQL 9.4 eller nyere, med det samlede FILTER
klausul:
count(*) FILTER (WHERE something > 0)
Du kan også bruge en sum af enere (og nuller).
PostgreSQL>=9.4 og SQLAlchemy>=1.0.0
Brug af en filtreret aggregeret funktion:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
Ældre PostgreSQL og/eller SQLAlchemy
SQL-analogen for "hvis" er enten CASE
udtryk eller i dette tilfælde nullif()
fungere. Begge kan bruges sammen med det faktum, at NULL
s tæller ikke:
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)))
Brug af nullif()
kan være lidt forvirrende, da "tilstanden" er det, du ikke vil tælle. Du kunne fremstille et udtryk, der ville gøre tilstanden mere naturlig, men det er overladt til læseren. Disse 2 er mere bærbare løsninger, men på den anden side FILTER
klausul er standard, selvom den ikke er almindelig tilgængelig.