sql >> Database teknologi >  >> RDS >> PostgreSQL

SQLAlchemy func.count på boolesk kolonne

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.



  1. Hvordan kan jeg eksportere indholdet af en oracle-tabel til en fil?

  2. Hvordan implementerer man batchhentning med Fluent NHibernate, når man arbejder med Oracle?

  3. Bedste praksis:Vedligeholdelses- og forbedringsopgaver for Oracle Cloud

  4. SQL-forespørgsel langsom i .NET-applikation, men øjeblikkelig i SQL Server Management Studio