sql >> Database >  >> RDS >> PostgreSQL

SQLAlchemy func.count op booleaanse kolom

Verzamelfuncties gebruiken in een HAVING clausule is zeer legaal, aangezien HAVING elimineert groepsrijen. Voorwaardelijk tellen kan worden bereikt door gebruik te maken van de eigenschap die NULL s tellen niet mee:

count(expression) ... aantal invoerrijen waarvoor de waarde van expressie niet null is

of bij gebruik van PostgreSQL 9.4 of hoger, met het geaggregeerde FILTER clausule:

count(*) FILTER (WHERE something > 0)

U kunt ook een som van enen (en nullen) gebruiken.

PostgreSQL>=9.4 en SQLAlchemy>=1.0.0

Een gefilterde aggregatiefunctie gebruiken:

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

Oudere PostgreSQL en/of SQLAlchemy

De SQL-analoog voor "if" is ofwel CASE expressie of in dit geval nullif() functie. Beide kunnen samen worden gebruikt met het feit dat NULL s tellen niet mee:

from sqlalchemy import case

...

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

of:

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

nullif() gebruiken kan een beetje verwarrend zijn omdat de "conditie" is wat je niet wil tellen. Je zou een uitdrukking kunnen gebruiken die de toestand natuurlijker zou maken, maar dat wordt overgelaten aan de lezer. Deze 2 zijn meer draagbare oplossingen, maar aan de andere kant is de FILTER clausule is standaard, maar niet algemeen beschikbaar.



  1. MySQL relationele databases gebruiken op Fedora 13

  2. Normaliseer transactiegegevens van tijd- en statuskolommen naar minuten per statuswaarde

  3. Beverly Hills 90210 en ZIP+4:omgaan met adressen in gegevensmodellen

  4. Unieke beperking toevoegen aan combinatie van twee kolommen