如何检查数字是否为NaN

Mik*_*e T 12 postgresql nan

我需要测试PostgreSQL中的数值/浮点值是否不是数字(NaN).请注意"PostgreSQL将NaN值视为相等",因此这个C++技巧不起作用.因为我isnan在PostgreSQL 9.3中没有看到任何功能,所以这是我最好的尝试:

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

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

Cra*_*ger 13

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

只需比较平等:

SELECT double precision 'NaN' = double precision 'NaN';
Run Code Online (Sandbox Code Playgroud)

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

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

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


Pod*_*kiy 5

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

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

或者:

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

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

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