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

Postgres फ़ंक्शन के लिए डिफ़ॉल्ट रिटर्न मान सेट करें

आपको sql . से भाषा बदलनी होगी करने के लिए plpgsql यदि आप PL/pgSQL की प्रक्रियात्मक विशेषताओं का उपयोग करना चाहते हैं। फंक्शन बॉडी भी बदल जाती है।

ध्यान रखें कि सभी पैरामीटर नाम फंक्शन बॉडी में दिखाई देते हैं , SQL कथन के सभी स्तरों सहित। यदि आप एक नामकरण विरोध पैदा करते हैं, तो आपको इस तरह के कॉलम नामों को तालिका-योग्यता प्राप्त करने की आवश्यकता हो सकती है:table.col , भ्रम की स्थिति से बचने के लिए। चूंकि आप स्थितीय संदर्भ ($n . द्वारा फ़ंक्शन पैरामीटर का संदर्भ देते हैं ) वैसे भी, मैंने इसे काम करने के लिए पैरामीटर नाम हटा दिए हैं।

अंत में, THEN IF . में गायब था कथन - त्रुटि संदेश का तत्काल कारण

कोई COALESCE NULL . को प्रतिस्थापित करने के लिए मूल्य। लेकिन यह केवल तभी काम करता है जब कम से कम एक परिणामी पंक्ति हो। COALESCE "कोई पंक्ति नहीं" को ठीक नहीं कर सकता यह केवल वास्तविक NULL को बदल सकता है मान।

सभी NULL . को कवर करने के कई तरीके हैं मामले plpgsql फ़ंक्शन . में :

CREATE OR REPLACE FUNCTION point_total(integer, date, OUT result bigint)
  RETURNS bigint AS
$func$
BEGIN

SELECT sum(p.points)          -- COALESCE would make sense ...
INTO   result
FROM   picks p
WHERE  p.user_id = $1
AND    p.gametime > $2
AND    p.points IS NOT NULL;  -- ... if NULL values were not ruled out

IF NOT FOUND THEN             -- If no row was found ...
   result := 0;               -- ... set to 0 explicitly
END IF;

END
$func$  LANGUAGE plpgsql;

या आप पूरी क्वेरी को COALESCE . में संलग्न कर सकते हैं बाहरी SELECT . में एक्सप्रेशन . SELECT . से "कोई पंक्ति नहीं" एक NULL में परिणाम देता है अभिव्यक्ति में। सादे SQL के रूप में कार्य करें, या आप इसे sql फ़ंक्शन . में लपेट सकते हैं :

CREATE OR REPLACE FUNCTION point_total(integer, date)
  RETURNS bigint AS
$func$
SELECT COALESCE(
  (SELECT sum(p.points)
   FROM   picks p
   WHERE  p.user_id = $1
   AND    p.gametime > $2
   -- AND    p.points IS NOT NULL  -- redundant here
  ), 0)
$func$  LANGUAGE sql;

संबंधित उत्तर:

नामकरण विरोधों के संबंध में

एक समस्या सबसे अधिक संभावना नामकरण संघर्ष थी। संस्करण 9.0 . में बड़े बदलाव हुए हैं . मैं रिलीज़ नोट को उद्धृत करता हूं :

बाद के संस्करणों ने व्यवहार को परिष्कृत किया है। स्पष्ट स्थानों में सही विकल्प स्वतः ही चुन लिया जाता है। संघर्षों की संभावना को कम करता है, लेकिन यह अभी भी है। सलाह अभी भी Postgres 9.3 में लागू होती है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ऑफ़सेट-निष्क्रिय और ऑफ़सेट-जागरूक डेटाटाइम घटा नहीं सकते

  2. PostgreSQL 11:विभाजन पैच के लिए पैच समीक्षक

  3. Java JUnit परीक्षण के लिए एंबेडेड PostgreSQL

  4. SchemaSpy PostgreSQL - WARN - कनेक्शन विफलता

  5. विंडोज़ 10 में निष्पादित होने पर 'डेटा निर्देशिका में गलत स्वामित्व है' त्रुटि देते हुए डॉकर कंटेनर बंद हो जाता है