2014-09-16 5 views
8

Ho bisogno di verificare se un valore numerico/float in PostgreSQL non è un numero (NaN). Si noti che "PostgreSQL treats NaN values as equal", quindi this C++ trick doesn't work. Come io non sto vedendo alcuna funzione isnan in PostgreSQL 9.3, qui è il mio migliore tentativo di fare uno:Come verificare se il numero è NaN

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

C'è un modo migliore per testare NaN s?

risposta

8

Esiste un modo migliore per testare i NaN?

confrontare Semplicemente per l'uguaglianza:

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

come, secondo i documenti si è collegato al, Pg tratta i NaN s come uguali. Sono sorpreso da questo, dato che tratta correttamente NULL come non uguale a qualsiasi altro NULL, e mi sarei aspettato NaN = NaN per restituire NULL, ma ... beh, funziona.

O se si desidera una funzione:

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

Essendo relativamente nuovo per plpgsql, mi sembra dato che 'float' ==' float8' == 'double precision' (almeno al momento), probabilmente vorrai scegliere un sinonimo e usarlo in modo coerente. –

+0

@DavidJ. Heh, piuttosto. –

+0

Che cosa significa "heh, piuttosto"? –

2

Qualsiasi valore NaN preso con un segno meno ancora è un valore NaN (proprio come uno zero), in modo da poter provare questo:

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

o:

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

Per quanto riguarda PostgreSQL tratta NaN valori superiori a tutti i valori non NaN, il seguente trucco è possibile:

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

Per Google BigQuery (e forse altri server sql là fuori), utilizzare la seguente

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

La domanda riguarda postgresql, dove IS_NAN non è definito –