sql >> Databáze >  >> RDS >> PostgreSQL

SQLAlchemy func.count na booleovském sloupci

Použití agregačních funkcí v HAVING klauzule je velmi legální, protože HAVING eliminuje skupinové řádky. Podmíněné počítání lze dosáhnout buď pomocí vlastnosti NULL se nepočítají:

count(expression) ... počet vstupních řádků, pro které hodnota výrazu není null

nebo pokud používáte PostgreSQL 9.4 nebo novější, s agregovaným FILTER klauzule:

count(*) FILTER (WHERE something > 0)

Můžete také použít součet jedniček (a nul).

PostgreSQL>=9.4 a SQLAlchemy>=1.0.0

Použití filtrované agregační funkce:

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

Starší PostgreSQL a/nebo SQLAlchemy

Analog SQL pro "if" je buď CASE výraz nebo v tomto případě nullif() funkce. Obojí lze použít společně s tím, že NULL se nepočítají:

from sqlalchemy import case

...

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

nebo:

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

Pomocí nullif() může být trochu matoucí, protože „podmínka“ je to, co neděláte chtít počítat. Můžete použít výraz, který by stav učinil přirozenějším, ale to je ponecháno na čtenáři. Tyto 2 jsou přenosnější řešení, ale na druhé straně FILTER klauzule je standardní, i když není široce dostupná.



  1. Oracle PL/SQL - tipy pro okamžitý výstup / tisk z konzole

  2. Západka DBCC_OBJECT_METADATA

  3. Omezení optimalizátoru s filtrovanými indexy

  4. Mohu zřetězit více řádků MySQL do jednoho pole?