表示

PostgreSQLでゼロ割り算エラー対策

SQLで0で割ったときに出るエラーの、22012(DIVISION_BY_ZERO)を楽に防ぐ方法。

完全に防ぐことはできないので、安全に割り算ができる特殊な演算子をCREATE OPERATORで作成して、ゼロ割り算になる可能性のある部分に適用するようにする。

まずは以下のSQLを実行する。

create function st_zero_div_to_null(numeric, numeric) returns numeric as '
select case $2 when 0 then null else $1 / $2 end;
' language sql;

create function st_zero_div_to_null(int, numeric) returns numeric as '
select case $2 when 0 then null else $1 / $2 end;
' language sql;

create function st_zero_div_to_null(numeric, int) returns numeric as '
select case $2 when 0 then null else $1 / $2 end;
' language sql;

create function st_zero_div_to_null(int, int) returns int as '
select case $2 when 0 then null else $1 / $2 end;
' language sql;

create operator // (
procedure = st_zero_div_to_null,
leftarg = int,
rightarg = int
);

create operator // (
procedure = st_zero_div_to_null,
leftarg = int,
rightarg = numeric
);

create operator // (
procedure = st_zero_div_to_null,
leftarg = numeric,
rightarg = int
);

create operator // (
procedure = st_zero_div_to_null,
leftarg = numeric,
rightarg = numeric
);

ゼロで割る可能性のあるSQLで、割り算の演算子[/]の代わりに[//]を使うと、ゼロ割り算の時にNULLを返すことができる。

select 5 / 0  --error
select 5 // 0 --NULL
select 6 / 3  -- 2
select 6 // 3 -- 2
個人用ツール