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;
NaN
sをテストするためのより良い方法はありますか?
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'
$$;
マイナス記号が付いた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;