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 条項は標準ですが、広く利用できるわけではありません。