2014-09-16 12 views
8

J'ai besoin de tester si une valeur numérique/flottante dans PostgreSQL n'est pas un nombre (NaN). Notez que "PostgreSQL treats NaN values as equal", donc this C++ trick doesn't work. Comme je ne vois aucune fonction isnan dans PostgreSQL 9.3, voici ma meilleure tentative de faire un:Comment vérifier si le numéro est NaN

create or replace function isnan(double precision) returns boolean as 
    $$select $1::text = 'NaN'::text$$ language sql; 

Y at-il une meilleure façon de tester NaN s?

Répondre

8

Existe-t-il une meilleure façon de tester les NaN?

comparer simplement pour l'égalité:

SELECT double precision 'NaN' = double precision 'NaN'; 

que, selon les documents que vous y est lié Pg traite NaN s comme égaux. Je suis surpris par cela, étant donné qu'il traite correctement NULL comme n'étant égal à aucun autre NULL, et aurait attendu NaN = NaN pour retourner NULL, mais ... eh bien, cela fonctionne.

Ou si vous voulez une fonction:

create or replace function isnan(double precision) 
language sql 
immutable 
returns boolean as $$ 
select $1 = double precision 'NaN' 
$$; 
+0

suivante étant relativement nouveau à plpgsql, il me semble que depuis float = float8 = = double précision (au moins à l'heure actuelle), vous voudriez probablement choisir un synonyme et l'utiliser de manière cohérente. –

+0

@DavidJ. Heh, plutôt. –

+0

Que signifie "heh, plutôt"? –

2

Toute valeur NaN prise avec un signe moins est encore une valeur NaN (comme un zéro), de sorte que vous pouvez essayer:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 = -$1 and $1 != 0.0 $$ language sql; 

ou:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 = -$1 and $1 = $1 + 1.0 $$ language sql; 

En ce qui concerne PostgreSQL traite NaN valeurs supérieures à toutes les valeurs non NaN, l'astuce suivante est possible:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 > 0 and -$1 > 0 $$ language sql; 
-3

Pour Google BigQuery (et peut-être d'autres serveurs SQL là-bas), utilisez le

SELECT * FROM [project:dataset.table] 
WHERE IS_NAN(field) = true 
+0

La question concerne postgresql, où IS_NAN n'est pas défini –