2017-06-21 131 views
0

我想将oracle数据库应用程序迁移到postgres。 我似乎无法在postgres中找到等价的NANVL。有没有一种方法来模拟相同的?什么是postgres中的NANVL(oracle函数)的等效

Oracle manual

的NANVL函数仅用于type BINARY_FLOAT或BINARY_DOUBLE的浮点数是有用的。它指示Oracle数据库在输入值n2是NaN(不是数字)时返回替代值n1。如果n2不是NaN,则Oracle返回n2。

+0

它(posgresql)不具备这样的功能。你可以做的是'coalesce'与这里的一个函数的混合:https://stackoverflow.com/questions/25858859/how-to-check-if-number-is-nan –

+1

因为你可能正在寻找对于来自Postgres专家的答案,您可能想要解释NANVL在Oracle中的作用,以免他们必须阅读Oracle文档。 – mustaccio

回答

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

编辑

当然,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

+0

根据[手册](https://docs.oracle.com/database/121/SQLRF/functions115.htm#SQLRF06311),函数仅在字符值为有效值时才检查'NaN'。 'nanvl('foo',1)'会产生一个错误。 –

相关问题