我需要测试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
?
答案 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