2017-06-21 3 views
0

J'essaye de migrer une application DB d'oracle à postgres. Je n'arrive pas à trouver un équivalent de NANVL dans postgres. Y a-t-il un moyen d'émuler la même chose?ce qui est un équivalent de NANVL (fonction oracle) dans postgres

De l'Oracle manual:

La fonction NANVL est utile que pour les nombres à virgule flottante de type BINARY_FLOAT ou BINARY_DOUBLE. Il demande à Oracle Database de renvoyer une valeur alternative n1 si la valeur d'entrée n2 est NaN (pas un nombre). Si n2 n'est pas NaN, Oracle renvoie n2.

+0

Il (PosgreSQL) ne possède pas cette fonction. Ce que vous pouvez faire est un mélange de 'coalesce' avec l'une des fonctions ici: https://stackoverflow.com/questions/25858859/how-to-check-if-number-is-nan –

+1

Puisque vous cherchez probablement Pour obtenir des réponses des experts de Postgres, vous pouvez expliquer ce que fait NANVL dans Oracle pour éviter qu'ils aient à lire la documentation Oracle. – mustaccio

Répondre

4

Dans Postgres, vous pouvez comparer une valeur numérique à la constante spéciale 'NaN':

select some_column = 'NaN' 
from some_table; 

Vous pouvez donc écrire une fonction qui mettra en œuvre 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

Modifier

Bien sûr, a_horse_with_no_name est correct.

Tout est plus simple: il suffit d'un CASE avec contrôle sur l'égalité à NaN est nécessaire http://sqlfiddle.com/#!17/37528

Tout est incorrect ci-dessous.

similaires aux conseils Jorge Campos: rip-off isnumeric de isnumeric() with PostgreSQL et le modifier à:

/* 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

Selon [le manuel] (https://docs.oracle.com/database/121/SQLRF/functions115.htm#SQLRF06311), la fonction ne vérifie que NaN si une valeur de caractère est une valeur valide. 'nanvl ('foo', 1)' va générer une erreur. –