Postgresql 如何检查号码是否为NaN

Postgresql 如何检查号码是否为NaN,postgresql,nan,Postgresql,Nan,我需要测试PostgreSQL中的数字/浮点值是否不是数字(NaN)。请注意。由于我在PostgreSQL 9.3中没有看到任何isnan函数,因此我最好尝试做一个: create or replace function isnan(double precision) returns boolean as $$select $1::text = 'NaN'::text$$ language sql; 有没有更好的方法来测试NaN值?任何带负号的NaN值仍然是NaN值(就像零一样),因此您可

我需要测试PostgreSQL中的数字/浮点值是否不是数字(NaN)。请注意。由于我在PostgreSQL 9.3中没有看到任何
isnan
函数,因此我最好尝试做一个:

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

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

任何带负号的NaN值仍然是NaN值(就像零一样),因此您可以尝试以下方法:

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

只要PostgreSQL处理大于所有非NaN值的NaN值,以下技巧是可能的:

create or replace function isnan(double precision) returns boolean as $$
select $1 > 0 and -$1 > 0 $$ language sql;
有没有更好的方法来测试NAN

简单地进行平等比较:

SELECT double precision 'NaN' = double precision 'NaN';
根据您链接到的文档,Pg将
NaN
s视为同等对待。我对此感到惊讶,因为它正确地将
NULL
视为不等于任何其他
NULL
,并期望
NaN
=
NaN
返回
NULL
,但是。。。嗯,这很有效

或者,如果您想要一个函数:

create or replace function isnan(double precision) 
language sql
immutable
returns boolean as $$
select $1 = double precision 'NaN'
$$;
对于GoogleBigQuery(可能还有其他sql服务器),请使用以下命令

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

您还可以使用类型转换来创建实际的
NaN
值以进行比较:

SELECT *
FROM (VALUES
    (1, 100),
    (2, 'NaN'::NUMERIC),
    (3, 300)
) A
WHERE column2 = 'NaN'::NUMERIC;
仅与
NaN
值匹配:

column1 | column2
--------+--------
      2 |    NaN

问题是关于postgresql,其中is_NAN的定义对于plpgsql来说相对较新,在我看来,既然
float
=
float8
=
双精度
(至少在当前),您可能希望选择一个同义词并一致使用它。
column1 | column2
--------+--------
      2 |    NaN