आपको 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 में लागू होती है।