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.