2014-09-16 4 views
8

है, मुझे जांच करने की आवश्यकता है कि PostgreSQL में कोई संख्यात्मक/फ्लोट मान संख्या (NaN) नहीं है। ध्यान दें कि "PostgreSQL treats NaN values as equal", इसलिए this C++ trick doesn't workयह जांचने के लिए कि क्या नंबर NaN

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

वहाँ NaN रों के लिए परीक्षण करने के लिए किसी भी बेहतर तरीका है: जैसा कि मैंने PostgreSQL 9.3 में किसी भी isnan समारोह नहीं दिखाई दे रहा है, यहाँ मेरा सबसे अच्छा एक बनाने के लिए प्रयास है?

उत्तर

8

क्या नाएन के लिए परीक्षण करने का कोई बेहतर तरीका है?

सीधे शब्दों में समानता के लिए तुलना:

SELECT double precision 'NaN' = double precision 'NaN'; 
रूप

, डॉक्स आप से जुड़ा हुआ प्रति, पृष्ठ व्यवहार करता है NaN रों के रूप में बराबर। मैं इससे आश्चर्यचकित हूं, यह देखते हुए कि यह NULL किसी अन्य NULL के बराबर नहीं है, और = NaNNULL वापस करने के लिए अपेक्षित होगा, लेकिन ... अच्छा, यह काम करता है।

या यदि आप एक समारोह चाहते हैं:

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

अपेक्षाकृत plpgsql करने के लिए नए होने के नाते, मुझे लगता है चूंकि 'float' ==' float8' == 'डबल परिशुद्धता '(कम से कम वर्तमान समय पर), तो आप शायद एक समानार्थी चुनना और लगातार इसका उपयोग करना चाहते हैं। –

+0

@ डेविड जे। हे, बल्कि। –

+0

"हे, बल्कि" क्या मतलब है? –

2

, ऋण चिह्न अभी भी एक NaN मूल्य (सिर्फ एक शून्य) की तरह है के साथ लिया तो आप इस कोशिश कर सकते हैं किसी भी NaN मूल्य: जहाँ तक PostgreSQL के रूप में

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

:

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

या व्यवहार करता है NaN सभी गैर-NaN मूल्यों की तुलना में अधिक महत्व देता है, निम्नलिखित चाल संभव है:

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

Google बिगक्वेरी (और वहाँ शायद अन्य एसक्यूएल सर्वर) के लिए, का उपयोग निम्न

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

प्रश्न postgresql के बारे में है, जहां IS_NAN परिभाषित नहीं है –

संबंधित मुद्दे