HAVING
で集計関数を使用する HAVING
なので、句は非常に合法です グループ行を削除します。条件付きカウントは、NULL
というプロパティを使用して実行できます。 sカウントしない:
count(expression)
...式の値がnullでない入力行の数
または、PostgreSQL 9.4以降を使用している場合は、集約FILTER
条項:
count(*) FILTER (WHERE something > 0)
1(および0)の合計を使用することもできます。
PostgreSQL>=9.4およびSQLAlchemy>=1.0.0
フィルター処理された集計関数の使用:
.having(func.count(1).filter(Question.accepted) >
func.count(1).filter(not_(Question.accepted)))
古いPostgreSQLおよび/またはSQLAlchemy
「if」のSQLアナログは、CASE
のいずれかです。 式またはこの場合はnullif()
働き。どちらもNULL
という事実と一緒に使用できます sカウントしない:
from sqlalchemy import case
...
.having(func.count(case([(Question.accepted, 1)])) >
func.count(case([(not_(Question.accepted), 1)])))
または:
.having(func.count(func.nullif(Question.accepted, False)) >
func.count(func.nullif(Question.accepted, True)))
nullif()
を使用する 「条件」はあなたがしないものであるため、少し混乱する可能性があります 数えたい。条件をより自然にする式を考案することもできますが、それは読者に任されています。これら2つはより移植性の高いソリューションですが、一方でFILTER
条項は標準ですが、広く利用できるわけではありません。