mysql中除数为0_PostgreSQL被除数为0处理方法

0不能作为被除数这是数学中的常识,当在数据库中除以0时,应该如何处理呢?

在oracle和pg中是不允许被除数为0的。

oracle:https://www.cndba.cn/foucus/article/4093

https://www.cndba.cn/foucus/article/4093

SQL> select 1/0 from dual;

select 1/0 from dual

*

ERROR at line 1:

ORA-01476: divisor is equal to zero

PostgreSQL:

bill@bill=>/set VERBOSITY verbose

bill@bill=>select 1/0;

ERROR: 22012: division by zero

LOCATION: int4div, int.c:824

我们可以在pg的代码中看到该报错的解释:https://www.cndba.cn/foucus/article/4093https://www.cndba.cn/foucus/article/4093

813 Datum

814 int4div(PG_FUNCTION_ARGS)

815 {

816 int32 arg1 = PG_GETARG_INT32(0);

817 int32 arg2 = PG_GETARG_INT32(1);

818 int32 result;

819

820 if (arg2 == 0)

821 {

822 ereport(ERROR,

823 (errcode(ERRCODE_DIVISION_BY_ZERO),

824 errmsg("division by zero")));

825 /* ensure compiler realizes we mustn't reach the division (gcc bug) */

826 PG_RETURN_NULL();

827 }

但是,如果业务要求当被除数=0时,像mysql中一样返回空,而不是报错,在pg中该如何实现呢?

mysql:https://www.cndba.cn/foucus/article/4093https://www.cndba.cn/foucus/article/4093https://www.cndba.cn/foucus/article/4093

mysql> select 1/0;

+------+

| 1/0 |

+------+

| NULL |

+------+

1 row in set, 1 warning (0.03 sec)

pg中对应的处理方法:

https://www.cndba.cn/foucus/article/4093

bill@bill=>select case when c2=0 then null else c1/c2 end from t2;

case

------

2

1

(3 rows)

—方法二:

自定义操作符https://www.cndba.cn/foucus/article/4093

bill@bill=>create or replace function div_zero(numeric, numeric) returns numeric as $$

bill$# select case when $2 <> 0 then $1/$2 else null end ;

bill$# $$ language sql strict immutable;

CREATE FUNCTION

bill@bill=>create operator // (procedure=div_zero, leftarg=numeric, rightarg=numeric);

CREATE OPERATOR

bill@bill=>select 1//0;

?column?

----------

(1 row)

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值