PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

यदि कोई मान नहीं मिलता है तो किसी फ़ंक्शन से मान कैसे वापस करें

स्पष्टीकरण

समस्या की जड़ "कुछ नहीं" की अस्पष्ट परिभाषा है।

NULL कुछ नहीं नहीं है , यह बिल्कुल अज्ञात है कि यह वास्तव में क्या है। SQL के संदर्भ में "कुछ नहीं" कोई पंक्ति नहीं . होगा :कुछ भी वापस नहीं किया जाता है। यह आमतौर पर तब होता है जब कोई पंक्ति नहीं मिलती है। लेकिन एग्रीगेट फ़ंक्शंस का उपयोग करते समय , ऐसा नहीं हो सकता क्योंकि, प्रति दस्तावेज़:

avg() रिटर्न NULL जब कोई पंक्तियाँ नहीं मिलती हैं (इसलिए "कुछ नहीं")। आपको NULL . के साथ एक पंक्ति मिलती है परिणाम के रूप में मान - जो ओवरराइट करता है आपके द्वारा प्रदर्शित कोड में आपका init मान।

समाधान

परिणाम को COALESCE . में लपेटें . अधिक सरल SQL फ़ंक्शन प्रदर्शित करना:

CREATE OR REPLACE FUNCTION get_height_sql(firstn varchar, lastn varchar)
  RETURNS float AS
$func$
   SELECT COALESCE(AVG(((p.h_feet * 12) + p.h_inches) * 2.54)::float, 0)
   FROM   player p
   WHERE  p.firstname = firstn
   AND    p.lastname = lastn
$func$  LANGUAGE sql STABLE;

SQL Fiddle.

इसका उपयोग plpgsql फ़ंक्शन में किया जा सकता है। यह फ़ंक्शन STABLE हो सकता है , बड़े प्रश्नों के संदर्भ में प्रदर्शन में मदद कर सकता है।

अन्य मामले

यदि आप वास्तव में कर सकते हैं कोई पंक्ति नहीं get प्राप्त करें एक प्रश्न से, एक साधारण COALESCE विफल हो जाएगा , क्योंकि इसे कभी क्रियान्वित नहीं किया जाता है।

एकल मान . के लिए परिणाम आप पूरी क्वेरी को इस तरह लपेट सकते हैं:

SELECT COALESCE((SELECT some_float FROM ... WHERE ... LIMIT 1), 0) AS result

पीएल/पीजीएसक्यूएल में वास्तव में फ़ंक्शन से लौटने से पहले जांच करने की क्षमता है। यह एक या अधिक स्तंभों वाली अनेक पंक्तियों के लिए कार्य करता है , बहुत। इसमें एक उदाहरण है। मैनुअल FOUND . के उपयोग को प्रदर्शित करना :

...
RETURN QUERY SELECT foo, bar ...;

IF NOT FOUND THEN
    RETURN QUERY VALUES ('foo_default'::text, 'bar_default'::text);
END IF;
...

संबंधित:

हमेशा बिल्कुल एक पंक्ति लौटाने के लिए , आप शुद्ध SQL का भी उपयोग कर सकते हैं :

SELECT foo, bar FROM tbl
UNION ALL
SELECT 'foo_default', 'bar_default'
LIMIT 1;

अगर पहला SELECT कोई पंक्ति नहीं देता है, दूसरा SELECT डिफ़ॉल्ट के साथ एक पंक्ति देता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL, खींचें और स्वैप करें

  2. रेल:पोस्टग्रेज पर टाइमज़ोन के साथ टाइम कॉलम कैसे बनाएं?

  3. सभी तालिकाओं के लिए अनुक्रम आईडी पोस्टग्रेएसक्यूएल को बल्क अपडेट कैसे करें

  4. आईडी के साथ रिकॉर्ड खोजने के लिए SQL क्वेरी किसी अन्य तालिका में नहीं है

  5. Postgresql में एक से अधिक कॉलम पर WHERE IN करना