2010-11-16 5 views
7

आप बता सकते हैं कि मेरी क्यों निम्नलिखित नहीं है postgres एसक्यूएल में काम कर ?:Postgres नेस्ट अगर मामले क्वेरी में

See updated code below 

अद्यतन:

मैं क्वेरी "0.30" फ्लोट के रूप में वापसी की उम्मीद है। यह निर्माण केवल परीक्षण के लिए है, मैं कुछ जटिल querys जो इस सशर्त संरचना पर निर्भर है ... लेकिन मैं न पता है कि यह कैसे तय करने के लिए ..

परिणाम है:

ERROR: syntax error at or near "1" 
LINE 4:  if 1=1 then 

अद्यतन:

इस निर्माण एक समारोह में प्रकट होता है ... इसलिए मैं निम्न कार्य करना चाहते हैं:

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$ 
    BEGIN 
    select (
     case (select '1') 
     when '1' then 
     if 1=1 then 
      0.30::float 
     else 
      0.50::float 
     end 
     else 
     1.00::float 
     end 
    ); 
    END; 
$$ LANGUAGE plpgsql; 

select f_test(1) as test; 

त्रुटि संदेश ऊपर देखें।

+0

उचित भाषा का उपयोग करें, यहां पीजी से परे कुछ भी उपयोग करने की आवश्यकता नहीं है। – Woot4Moo

+0

"काम नहीं कर रहा है" परिभाषित करें। आप क्या होने की उम्मीद करते थे, और वास्तव में क्या हुआ। – Hamish

+0

आप जिस वास्तविक आउटपुट की अपेक्षा कर रहे हैं वह क्या है? – Woot4Moo

उत्तर

9

पोस्टग्रेज़ में सामान्य SQL क्वेरी के लिए IF expr THEN result ELSE result END वाक्यविन्यास नहीं है। वहाँ MySQL में के रूप में है के रूप में न तो एक IF() समारोह, आप CASE उपयोग करने के लिए:

select (
    case (select '1') 
    when '1' then 
    case when 1=1 then 0.30::float else 0.50::float end 
    else 
    1.00::float 
    end 
); 
+0

हां, देखें http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html – Lichtamberg

+0

कोई नहीं, यह संग्रहित प्रक्रियाओं के लिए है। उनके लिए MySQL में भी एक है, लेकिन सामान्य SQL के लिए * नहीं *। – AndreKR

+0

Ive ने मेरी पोस्ट अपडेट की है, मैं इस कोड को फ़ंक्शन में उपयोग करता हूं ... तो इसे काम करना चाहिए? – Lichtamberg

1

मैं नहीं जानता कि तुम क्या इस समारोह के साथ प्राप्त करने के लिए कोशिश कर रहे हैं, लेकिन यहाँ एक काम संस्करण है।

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$ 
BEGIN 
    IF myvalue = 1 THEN 
      IF 1=1 THEN 
        RETURN 0.30::FLOAT; 
      ELSE 
        RETURN 0.50::FLOAT; 
      END IF; 
    ELSE 
      RETURN 1.0::FLOAT; 
    END IF; 
END; 

फ़ंक्शन 0.3 यदि इनपुट मान 1 है, अन्यथा यह वापस आ जाएंगे, 1. संपादित करें: ध्यान दें कि 0.5 समारोह से कभी नहीं दिया जाता है।

+0

यह केवल एक परीक्षण समारोह के बिना है .. लेकिन मेरे पास जटिल प्रश्न हैं जो इस सशर्त संरचना पर निर्भर करते हैं .. मैं आपका जवाब आज़माउंगा ... धन्यवाद – Lichtamberg