2014-09-16 81 views
8

olup olmadığını kontrol etme PostgreSQL'de sayısal/float değerinin bir sayı (NaN) olup olmadığını test etmem gerekiyor. Not "PostgreSQL treats NaN values as equal", yani this C++ trick doesn't work.Numaranın NaN

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

NaN s için test etmek daha iyi bir yolu var mı: Ben PostgreSQL 9.3 herhangi isnan fonksiyonunu göremiyorum gibi, burada bir tane yapmak için elimden geleni girişimidir?

cevap

8

NaN'leri test etmek için daha iyi bir yol var mı?

Basitçe eşitlik için karşılaştırma: Eğer bağlı dokümanlar başına

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

, Pg NaN s olarak eşit davranır. NULL'un diğer NULL'a eşit olmadığını ve = NaN değerini NULL döndürmesini beklediğinden, buna şaşıyorum, ama işe yarar. Eğer bir işlev istiyorsanız

Veya:

Google BigQuery'ye (ve orada belki diğer sql sunucular) için
create or replace function isnan(double precision) 
language sql 
immutable 
returns boolean as $$ 
select $1 = double precision 'NaN' 
$$; 
+0

plpgsql nispeten yeni olan kullanmak, bana öyle geliyor float' == 'float8' ==' double precision''dan (en azından şu anki zamanda) beri, muhtemelen bir eşanlamlı seçmek ve sürekli olarak kullanmak isteyebilirsiniz. –

+0

@DavidJ. Heh, daha doğrusu. –

+0

"heh, yerine" ne anlama geliyor? –

2

bu deneyebilirsiniz, bir eksi işareti hala (sadece sıfır gibi) bir NaN değeri ile çekilen Herhangi NaN değeri:

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

ya:

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

Bildiğim kadarıyla PostgreSQL olarak ikramlar NaN olmayan tüm NaN değerlerden daha büyük değerler aşağıdaki hile mümkündür:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 > 0 and -$1 > 0 $$ language sql; 
-3

aşağıdaki

SELECT * FROM [project:dataset.table] 
WHERE IS_NAN(field) = true 
+0

Soru, IS_NAN'ın tanımlanmadığı postgresql hakkındadır. –