我想将oracle数据库应用程序迁移到postgres。 我似乎无法在postgres中找到等价的NANVL。有没有一种方法来模拟相同的?什么是postgres中的NANVL(oracle函数)的等效
的NANVL函数仅用于type BINARY_FLOAT或BINARY_DOUBLE的浮点数是有用的。它指示Oracle数据库在输入值n2是NaN(不是数字)时返回替代值n1。如果n2不是NaN,则Oracle返回n2。
我想将oracle数据库应用程序迁移到postgres。 我似乎无法在postgres中找到等价的NANVL。有没有一种方法来模拟相同的?什么是postgres中的NANVL(oracle函数)的等效
的NANVL函数仅用于type BINARY_FLOAT或BINARY_DOUBLE的浮点数是有用的。它指示Oracle数据库在输入值n2是NaN(不是数字)时返回替代值n1。如果n2不是NaN,则Oracle返回n2。
在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;
编辑
当然,a_horse_with_no_name是正确的。
一切都简单了:下面只是支票平等楠CASE
需要http://sqlfiddle.com/#!17/37528
一切不正确。
豪尔赫·坎波斯建议类似:从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
根据[手册](https://docs.oracle.com/database/121/SQLRF/functions115.htm#SQLRF06311),函数仅在字符值为有效值时才检查'NaN'。 'nanvl('foo',1)'会产生一个错误。 –
它(posgresql)不具备这样的功能。你可以做的是'coalesce'与这里的一个函数的混合:https://stackoverflow.com/questions/25858859/how-to-check-if-number-is-nan –
因为你可能正在寻找对于来自Postgres专家的答案,您可能想要解释NANVL在Oracle中的作用,以免他们必须阅读Oracle文档。 – mustaccio