我正在尝试将oracle数据库应用程序迁移到postgres。 我似乎无法在postgres中找到相当于NANVL的东西。有没有办法模仿相同的?
NANVL函数仅对BINARY_FLOAT或BINARY_DOUBLE类型的浮点数有用。如果输入值n2是NaN(不是数字),它指示Oracle数据库返回备用值n1。如果n2不是NaN,则Oracle返回n2。
答案 0 :(得分:4)
在Postgres中,您可以将数值与特殊常量'NaN'
进行比较:
select some_column = 'NaN'
from some_table;
所以你可以编写一个实现nanvl()
的函数:
create function nanvl(p_to_test numeric, p_default numeric)
returns numeric
as
$$
select case
when p_to_test = 'NaN' then p_default
else p_to_test
end;
$$
language sql;
答案 1 :(得分:1)
修改强>
当然,a_horse_with_no_name是正确的。
一切都比较简单:只需CASE
检查NaN是否相等http://sqlfiddle.com/#!17/37528
以下所有内容均不正确。
类似于Jorge Campos的建议:从isnumeric() with PostgreSQL扯掉isnumeric
并将其修改为:
/* Ripoff https://stackoverflow.com/questions/16195986/isnumeric-with-postgresql */
CREATE OR REPLACE FUNCTION nanvl(text, NUMERIC) RETURNS NUMERIC AS $$
DECLARE x NUMERIC;
BEGIN
x = $1::NUMERIC;
RETURN x;
EXCEPTION WHEN others THEN
RETURN $2;
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;
GO
SQLFiddle:http://sqlfiddle.com/#!17/aee9d/1