PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

SQLAlchemy func.count w kolumnie logicznej

Używanie funkcji agregujących w HAVING klauzula jest bardzo legalna, ponieważ HAVING eliminuje wiersze grupy. Zliczanie warunkowe można osiągnąć za pomocą właściwości, która NULL nie liczą się:

count(expression) ... liczba wierszy wejściowych, dla których wartość wyrażenia nie jest pusta

lub jeśli używasz PostgreSQL 9.4 lub nowszego, z agregacją FILTER klauzula:

count(*) FILTER (WHERE something > 0)

Możesz również użyć sumy jedynek (i zer).

PostgreSQL>=9.4 i SQLAlchemy>=1.0.0

Używając filtrowanej funkcji agregującej:

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

Starszy PostgreSQL i/lub SQLAlchemy

Analogiem SQL dla „if” jest albo CASE wyrażenie lub w tym przypadku nullif() funkcjonować. Oba mogą być używane razem z tym, że NULL nie liczą się:

from sqlalchemy import case

...

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

lub:

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

Używanie nullif() może być nieco mylące, ponieważ „warunek” jest tym, czego nie robisz chcesz liczyć. Można by wymyślić wyrażenie, które uczyniłoby stan bardziej naturalnym, ale to pozostawia się czytelnikowi. Te dwa rozwiązania są bardziej przenośne, ale z drugiej strony FILTER klauzula jest standardowa, choć nie jest powszechnie dostępna.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź wartości, które nie zawierają liczb w PostgreSQL

  2. Jak zwrócić tablicę jsonb i tablicę obiektów z moich danych?

  3. Jak zainstalować wiele serwerów PostgreSQL w systemie RedHat Linux?

  4. Używanie wielu schematów PostgreSQL z modelami Rails

  5. Co nowego w PostgreSQL 11