SELECT句で除算を実行したいと思います。いくつかのテーブルを結合して集計関数を使用すると、多くの場合、区切り文字としてnull値またはゼロ値があります。今のところ、ゼロとヌル値による除算を回避するこの方法を思いついただけです。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
これを行うより良い方法があるのだろうか?
count()
はNULL
を返さないので(他の集約関数とは異なり)、0
case(とにかく唯一の問題のあるケースです):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
count
を除いて、行が選択されていない場合、これらの関数はnull値を返すことに注意してください。
NULLIF関数を使用できます。
something/NULLIF(column_name,0)
column_name
は0-式全体の結果はNULLになります
これは古い質問ですが、別の解決策はgreatest関数を使用することです。
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
注:私の好みは、ErwinやYuriyの答え、または値を検出して論理的にこれを解決するには、除算操作の前に0
を返し、0
を返します。そうしないと、1
を使用してデータが誤って表現される可能性があります。
1に置き換えるゼロによる除算を回避する別のソリューション
select column + (column = 0)::integer;
カウントがゼロのときにディバイダーを1にしたい場合:
count(column_name) + 1 * (count(column_name) = 0)::integer
true
からinteger
へのキャストは1です。