web-dev-qa-db-ja.com

番号がNaNかどうかを確認する方法

PostgreSQLの数値/浮動小数点値が数値(NaN)でないかどうかをテストする必要があります。 "PostgreSQLはNaN値を等しいものとして扱う" であることに注意してください このC++トリックは機能しません 。 PostgreSQL9.3にisnan関数が表示されないので、これが最善の試みです。

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

NaNsをテストするためのより良い方法はありますか?

14
Mike T

NaNをテストするためのより良い方法はありますか?

単純に同等性を比較します。

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

リンクしたドキュメントによると、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'
$$;
14
Craig Ringer

マイナス記号が付いた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;
4
Podgorskiy