2012-04-04 20 views
10

मुझे हमेशा पोस्टग्रेस से निम्न त्रुटि क्यों मिलती है?PostgreSQL IF-THEN-ELSE नियंत्रण संरचना

syntax error at or near "IF"

मैं PostgreSQL: Documentation: 8.3: Control Structures पढ़ें। सबसे पहले मैं एक मुश्किल क्वेरी (सबक्वेरी के साथ) पर अमल करने की कोशिश की, लेकिन तब मैं इस तरह एक साधारण एक पर अमल करने की कोशिश की:

IF 2 <> 0 THEN select * from users; END IF; 

त्रुटि अभी भी एक ही है। मैं क्या गलत कर रहा हूं?

उत्तर

18
IF 2 <> 0 THEN select * from users; END IF; 

आप plpgsql फ़ंक्शंस के बाहर पीएल/पीजीएसक्यूएल कथन का उपयोग नहीं कर सकते हैं। और यदि यह टुकड़ा plpgsql फ़ंक्शन से है, तो यह भी बकवास है। आप टी-एसक्यूएल की तरह क्वेरी के परिणाम सीधे वापस नहीं कर सकते हैं।

CREATE OR REPLACE FUNCTION test(p int) 
RETURNS SETOF users AS $$ 
BEGIN 
    IF p = 1 THEN 
    RETURN QUERY SELECT * FROM users; 
    END IF; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 

जब आप समारोह से कुछ परिणाम मिलेगा, तो आप वापसी कथन का उपयोग करना - plpgsql केवल समारोह जानता है, यह प्रक्रियाओं का समर्थन नहीं करता - तो असीम चयन समझ नहीं किया है।

+0

ओह, आपके उत्तर के लिए भी धन्यवाद। नहीं, मैं बस "आईएफ" में शर्त के आधार पर एक या दूसरे "चयन" बनाने के तरीके पर खोज कर रहा था। इसलिए जैसा कि मैंने पाया कि इस तरह सरल में ऐसा करने का कोई तरीका नहीं है (चयन करें ...) = 2 फिर चुनें ... ELSE चुनें ... अंत अगर; – Elkan

+0

असल में आईएफ (टी से एक का चयन करें) = 2 फिर न्यूल; अंत IF; काम करेगा, समस्या शायद यह है कि आप किसी संदर्भ में कुछ चुनने की कोशिश कर रहे हैं, जो कुछ भी वापस नहीं करता है। इस मामले में पावेल ने एक आदर्श उदाहरण बनाया। आप 'रिटर्न QUERY' को ध्यान में रखते हुए उपयोग कर सकते हैं, कि आपने अपने फ़ंक्शन को सही तरीके से परिभाषित किया है। – valgog

4

आप उस पीएल/पीजीएसक्यूएल नियंत्रण संरचना को anonymous block या पीएल/पीजीएसक्यूएल फ़ंक्शन में संलग्न नहीं कर रहे हैं।

इस नियंत्रण संरचना के SQL संस्करण के लिए CASE के लिए दस्तावेज़ देखें।

+0

हम्म ... बहुत बहुत शुक्रिया) – Elkan

+0

मामला शीर्ष-स्तर पर है, हालांकि केवल एक SQL क्वेरी का एक हिस्सा के रूप में इस्तेमाल नहीं किया जा सकता। दूसरे शब्दों में, इसका उपयोग ऐसे व्यवहार को निर्देशित करने के लिए नहीं किया जा सकता है जो पहले से ही किसी अन्य प्रश्न का हिस्सा नहीं है, जो मूल प्रश्न चाहता है। – BlueBomber

0

आप उस पीएल/पीजीएसक्यूएल को संलग्न नहीं कर रहे हैं। उन्हें anonymous code block के साथ संलग्न करने की आवश्यकता है। अपने कोड के लिए उदाहरण:

DO $$ BEGIN 

    IF 2 <> 0 THEN select * from users; END IF; 

END$$;