2011-03-01 51 views
1

我有我的轨道与postgre数据库应用程序,我试图得到一些指标,用下面的语句Rails的:防止被零除在Postgres

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base)/sum(amount_after_annualised_base) as pt').first 

我怎么能确保总和(amount_after_annualised_base )不是0(因此不会抛出“除零”错误)?

我发现了这个,但不知道它是正确的/最好的/最有效的方式。

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base)/(CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(amount_after_annualised_base) END) as pt').first 

谢谢! 皮埃尔

回答

4

使用nullif

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base)/nullif(sum(amount_after_annualised_base),0) as pt').first 

这仅仅是你的解决方案consise速记:

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base)/(CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(amount_after_annualised_base) END) as pt').first 
+0

这是行不通的?因为你仍然试图在所有情况下进行分工。 – nathanvda 2011-03-01 14:12:36

+0

它实际上工作。为了简明起见,我拿这个 – Pierre 2011-03-01 18:52:36

3

如何:

Negotiation.find(:all, 
       :conditions => conditions_hash('negotiation'), 
       :select => 'sum(amount_after_annualised_base) sum_amount, 
          sum(payment_term * amount_after_annualised_base)/greatest(1,sum_amount) as pt').first 

,并在你的代码检查,如果sum_amount为零。

+0

不错,使用最大(1,sum_amount)是最酷的方式。谢谢。 – Fred 2013-04-09 15:58:36

2

我认为你需要写类似

Negotiation.find(
    :all, :conditions => conditions_hash('negotiation'), 
    :select => 'CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(payment_term * amount_after_annualised_base)/sum(amount_after_annualised_base) END as pt').first 

这将返回如果sum(amount_after_annualised_base)为零,则为NULL,否则请求的divis离子。