2017-06-21 51 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)'會產生一個錯誤。 –

相關問題