Postgresql 如何检查号码是否为NaN
我需要测试PostgreSQL中的数字/浮点值是否不是数字(NaN)。请注意。由于我在PostgreSQL 9.3中没有看到任何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值(就像零一样),因此您可
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