PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

SQLAlchemy func.count na coluna booleana


Usando funções agregadas em um HAVING cláusula é muito legal, pois HAVING elimina linhas de grupo. A contagem condicional pode ser obtida usando a propriedade que NULL s não contam:

count(expression) ... número de linhas de entrada para as quais o valor da expressão não é nulo

ou se estiver usando o PostgreSQL 9.4 ou posterior, com o agregado FILTER cláusula:
count(*) FILTER (WHERE something > 0)

Você também pode usar uma soma de uns (e zeros).

PostgreSQL>=9.4 e SQLAlchemy>=1.0.0


Usando uma função de agregação filtrada:
.having(func.count(1).filter(Question.accepted) >
        func.count(1).filter(not_(Question.accepted)))

PostgreSQL e/ou SQLAlchemy mais antigos


O análogo SQL para "if" é CASE expressão ou neste caso nullif() função. Ambos podem ser usados ​​em conjunto com o fato de que NULL s não contam:
from sqlalchemy import case

...

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

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

Usando nullif() pode ser um pouco confuso, pois a "condição" é o que você não quer contar. Você poderia inventar uma expressão que tornaria a condição mais natural, mas isso fica para o leitor. Essas 2 são soluções mais portáteis, mas por outro lado o FILTER cláusula é padrão, embora não amplamente disponível.