如何检查数字是否为NaN

时间:2014-09-16 00:17:55

标签: postgresql nan

我需要测试PostgreSQL中的数值/浮点值是否不是数字(NaN)。请注意"PostgreSQL treats NaN values as equal",所以this C++ trick doesn't work。因为我在PostgreSQL 9.3中没有看到任何isnan函数,所以我最好尝试制作一个:

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

有没有更好的方法来测试NaN

3 个答案:

答案 0 :(得分:12)

  

有没有更好的方法来测试NaN?

简单比较平等:

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

as,根据您链接到的文档,Pg将NaN视为平等。我对此感到惊讶,因为它正确地将NULL视为不等于任何其他NULL,并且期望NaN = NaN返回NULL,但是......好吧,它有效。

或者如果你想要一个功能:

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

答案 1 :(得分:4)

使用减号的任何NaN值仍然是NaN值(就像零),所以你可以试试这个:

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

或:

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

只要PostgreSQL将NaN值视为大于所有非NaN值,就可以采用以下技巧:

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

答案 2 :(得分:-4)

对于Google BigQuery(可能还有其他sql服务器),请使用以下

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