PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQLAlchemy func.count in der booleschen Spalte

Verwendung von Aggregatfunktionen in einem HAVING Klausel ist sehr legal, da HAVING eliminiert Gruppenzeilen. Bedingtes Zählen kann entweder durch Verwendung der Eigenschaft NULL erreicht werden s zählen nicht:

count(expression) ... Anzahl der Eingabezeilen, für die der Wert von expression nicht null ist

oder bei Verwendung von PostgreSQL 9.4 oder höher mit dem Aggregat FILTER Klausel:

count(*) FILTER (WHERE something > 0)

Sie können auch eine Summe aus Einsen (und Nullen) verwenden.

PostgreSQL>=9.4 und SQLAlchemy>=1.0.0

Verwendung einer gefilterten Aggregatfunktion:

.having(func.count(1).filter(Question.accepted) >
        func.count(1).filter(not_(Question.accepted)))

Älteres PostgreSQL und/oder SQLAlchemy

Das SQL-Analogon für „if“ ist entweder CASE Ausdruck oder in diesem Fall nullif() Funktion. Beide können zusammen mit der Tatsache verwendet werden, dass NULL s zählen nicht:

from sqlalchemy import case

...

.having(func.count(case([(Question.accepted, 1)])) >
        func.count(case([(not_(Question.accepted), 1)])))

oder:

.having(func.count(func.nullif(Question.accepted, False)) >
        func.count(func.nullif(Question.accepted, True)))

Verwenden von nullif() kann etwas verwirrend sein, da die "Bedingung" das ist, was Sie nicht tun zählen wollen. Sie könnten einen Ausdruck finden, der den Zustand natürlicher macht, aber das bleibt dem Leser überlassen. Diese 2 sind tragbarere Lösungen, aber auf der anderen Seite der FILTER -Klausel ist Standard, wenn auch nicht allgemein verfügbar.