2014-09-16 25 views
8

Ich muss testen, ob ein numerischer/Gleitkommawert in PostgreSQL keine Zahl (NaN) ist. Beachten Sie, dass "PostgreSQL treats NaN values as equal", also this C++ trick doesn't work. Da ich keine isnan Funktion in PostgreSQL 9.3 zu sehen, hier ist mein bester Versuch zu machen:Wie überprüft man, ob die Nummer NaN ist

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

Gibt es einen besseren Weg für NaN s zu testen?

Antwort

8

Gibt es einen besseren Weg, um NaNs zu testen?

vergleichen Sie einfach auf Gleichheit:

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

als je die Dokumentation Sie verknüpft, Pg behandelt NaN s als gleich. Ich bin davon überrascht, da es NULL als nicht gleich NULL behandelt, und würde = NaNNULL erwarten, aber ... nun, es funktioniert.

Oder wenn Sie eine Funktion wollen:

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

relativ neu zu sein, plpgsql, scheint es mir, dass seit 'float' ==' float8' == 'double precision' (zumindest zur aktuellen Zeit), würden Sie wahrscheinlich ein Synonym auswählen und es konsistent verwenden möchten. –

+0

@DavidJ. Heh, eher. –

+0

Was bedeutet "heh, eher"? –

2

Jede noch mit einem Minuszeichen genommen NaN-Wert ist ein Wert NaN (wie eine Null), so können Sie dies versuchen:

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

oder:

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

Soweit PostgreSQL Leckereien NaN-Werte größer als alle nicht-NaN-Werte, der folgende Trick möglich:

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

Für Google BigQuery (und vielleicht auch andere SQL-Server gibt), verwenden Sie die folgende

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

Die Frage bezieht sich auf postgresql, wobei IS_NAN nicht definiert ist –

Verwandte Themen