web-dev-qa-db-ja.com

PostgreSQLでゼロによる除算を避ける

SELECT句で除算を実行したいと思います。いくつかのテーブルを結合して集計関数を使用すると、多くの場合、区切り文字としてnull値またはゼロ値があります。今のところ、ゼロとヌル値による除算を回避するこの方法を思いついただけです。

(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END) 

これを行うより良い方法があるのだろうか?

48
William

count()NULLを返さないので(他の集約関数とは異なり)、0 case(とにかく唯一の問題のあるケースです):

CASE count(column_name)
   WHEN 0 THEN 1
   ELSE count(column_name)
END

集計関数に関するマニュアルを引用:

countを除いて、行が選択されていない場合、これらの関数はnull値を返すことに注意してください。

31

NULLIF関数を使用できます。

something/NULLIF(column_name,0)

column_nameは0-式全体の結果はNULLになります

156
Yuriy Galanter

これは古い質問ですが、別の解決策はgreatest関数を使用することです。

greatest( count(column_name), 1 )  -- NULL and 0 are valid argument values

注:私の好みは、ErwinやYuriyの答え、または値を検出して論理的にこれを解決するには、除算操作の前に0を返し、0を返します。そうしないと、1を使用してデータが誤って表現される可能性があります。

26
vol7ron

1に置き換えるゼロによる除算を回避する別のソリューション

select column + (column = 0)::integer;
2
Manvel

カウントがゼロのときにディバイダーを1にしたい場合:

count(column_name) + 1 * (count(column_name) = 0)::integer

trueからintegerへのキャストは1です。

1
Clodoaldo Neto