什么是postgres中的NANVL(oracle函数)的等价物

时间:2017-06-21 00:51:56

标签: oracle postgresql database-migration

我正在尝试将oracle数据库应用程序迁移到postgres。 我似乎无法在postgres中找到相当于NANVL的东西。有没有办法模仿相同的?

来自Oracle manual

  

NANVL函数仅对BINARY_FLOAT或BINARY_DOUBLE类型的浮点数有用。如果输入值n2是NaN(不是数字),它指示Oracle数据库返回备用值n1。如果n2不是NaN,则Oracle返回n2。

2 个答案:

答案 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