sql >> Databasteknik >  >> RDS >> PostgreSQL

SQLAlchemy func.count på boolesk kolumn

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.



  1. Hur man gör en fråga med group_concat i sql-server

  2. Hur skickar man tabellvärderade parametrar från Java till SQL Server lagrad procedur?

  3. Knee-Jerk Wait Statistik:SOS_SCHEDULER_YIELD

  4. Var lagrar PostgreSQL konfigurations-/conf-filer?