我想將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