PostgreSQL 视图错误处理

Posted

技术标签:

【中文标题】PostgreSQL 视图错误处理【英文标题】:PostgreSQL View Error Handling 【发布时间】:2015-03-12 04:48:15 【问题描述】:

下面给出的代码是我创建的视图的一部分。但有时它可能会抛出一个错误说:

division by zero

此错误的原因是 sum(bills.past_arrear) 部分可能在几个月内为 0。

SELECT (SELECT revenue_driver.driver_id 
        FROM ccdb.revenue_driver 
        WHERE revenue_driver.driver_desc::text = 'Arrear Collection Efficiency'::text) AS driver_id
       ,bills.org_unit_id::integer AS section_id
       ,date_part('Month'::text, bills.due_date) AS mnth
       ,date_part('Year'::text, bills.due_date) AS yr
       ,ROUND(SUM(COALESCE(bills.arrear_collected,0::numeric))/sum(bills.past_arrear)*100::numeric, 2) AS per_efficiency
       ,now() AS creation_dt
FROM ccdb.bills
WHERE bills.due_date::date >= date_trunc('Month'::text,'now'::text::date::timestamp with time zone)::date
AND bills.due_date::date <= 'now'::text::date
AND (bills.bill_type_group_code::text = ANY (ARRAY['EB'::character varying::text, 'Energy'::character varying::text]))
GROUP BY bills.org_unit_id, date_part('Year'::text, bills.due_date), date_part('Month'::text, bills.due_date);

我想要的是如果 ROUND(SUM(COALESCE(bills.arrear_collected,0::numeric))/sum(bills.past_arrear)*100::numeric, 2) 抛出 除以零错误我想用0替换值。

我不知道如何处理这个错误。请有人帮助我。

【问题讨论】:

【参考方案1】:

您需要在您的选择语句中使用CASE WHEN,如下所示:-

CASE 
    WHEN sum(bills.past_arrear) = 0
    THEN 0
    ELSE ROUND(SUM(COALESCE(bills.arrear_collected, 0::NUMERIC)) / sum(bills.past_arrear) * 10 ‌​0::NUMERIC, 2)
END AS per_efficiency

【讨论】:

感谢朋友的帮助。

以上是关于PostgreSQL 视图错误处理的主要内容,如果未能解决你的问题,请参考以下文章

Untunbu下postgresql安装及常见错误处理

PostgreSQL存储过程-异常错误处理

使用 PostgreSQL 时使用 COPY 命令处理错误

02-PostgreSQL 存储过程的进阶介绍(含游标错误处理自定义函数事务)

记一次pg_rman备份postgresql数据库报段错误的处理过程

记一次pg_rman备份postgresql数据库报段错误的处理过程