sql - Posgtres CASE condition with SUM aggregation evaluates not needed ELSE part -
के अनुसार:
कोई भी अभिव्यक्ति किसी भी subexpressions का मूल्यांकन नहीं करता है जो कि आवश्यक नहीं हैं परिणाम निर्धारित करें उदाहरण के लिए, यह एक विभाजन-शून्य-शून्य विफलता से बचने का एक संभावित तरीका है:
SELECT ... कहां का केस जब x
क्यों निम्नलिखित अभिव्यक्ति एक
त्रुटि: शून्य से विभाजन लौटाता है - जाहिरा तौर पर दूसरे भाग का मूल्यांकन:
का चयन करें जब SUM (0) = 0 तब 42 या 43/0 END
जबकि
का चयन करें जब SUM (0) = 0 तो 42 ईएलएस 43 ईडी
42 रिटर्न देता है।
संपादित करें: इसलिए उपरोक्त उदाहरण विफल हो जाता है क्योंकि पोस्टग्रेस नियोजन चरण में पहले से ही अपरिवर्तनीय मूल्यों (43/0) का अनुमान लगाते हैं। हमारी वास्तविक क्वेरी इस तरह दिखती है:
मामला जब राशि (कॉलम 1) = 0 तब 0 और गोल (राशि (घंटे * घंटे / स्तंभ 1), 2)
हालांकि यह क्वेरी अस्थायी नहीं दिखती है (वास्तविक मानों पर निर्भर करता है), फिर भी शून्य त्रुटि से एक विभाजन है। बेशक राशि (कॉलम 1) वास्तव में हमारे मामले में 0 है।
दिलचस्प उदाहरण यह एक अच्छा स्पष्टीकरण है कहें कि आपके पास इस तरह के डेटा हैं:
db = # तालिका परीक्षण; स्तंभ 1 | कीमत | घंटे --------- + ------- + ------- 1 | 2 | 3 3 | 2 | 1
PostgreSQL आपके पास दो पास में निष्पादित करता है, पहले यह सभी समस्त कार्य (जैसे
sum () ) की गणना करेगा:
db = # राशि का चयन (राशिफल 1) sum1 के रूप में, राशि (मूल्य * घंटे / स्तंभ 1) परीक्षण से sum2 के रूप में; Sum1 | Sum2 ------ + ------ 4 | 6
और फिर यह आपके अंतिम अभिव्यक्ति में उन परिणामों को प्लग करेगा और वास्तविक परिणाम की गणना करेगा:
db = # के रूप में temp के रूप में (db (# select राशि (कॉलम 1) सम 1 के रूप में, राशि (मूल्य * घंटे / कॉलम 1) से परीक्षण 2 (2) के लिए sum2 = 2, फिर से 0 दूसरा राउंड (sum2, 2) अंत से अस्थायी, राउंड ------- 6.00
अब स्पष्ट रूप से पहले कुल पास में कोई त्रुटि है, तो यह कभी भी CASE कथन तक नहीं पहुंचता है।
इसलिए यह वास्तव में एक समस्या नहीं है मामला कथन - यह सभी सशर्त निर्माणों पर लागू होता है - लेकिन जिस तरह से समुच्चय को एक चयन कथन में संसाधित किया जाता है, इस तरह की समस्या किसी अन्य संदर्भ में नहीं हो सकती क्योंकि समुच्चय केवल SELECT में स्वीकार्य हैं।
लेकिन दस्तावेज को इस मामले में भी अद्यतन करने की आवश्यकता है। इस उदाहरण में सही प्रलेखन "" है। चरण # 4 में ग्रुप द्वारा और होविंग क्लॉज के बारे में बात करती है, लेकिन यह वास्तव में इस चरण में किसी भी समेकित कार्य का मूल्यांकन करता है, भले ही ग्रुप बाय / हा विंग। और आपके केस स्टेटमेंट का चरण # 5 में मूल्यांकन किया गया है।
समाधान
सामान्य समाधान, यदि आप कुल इनपुट को अनदेखा करना चाहते हैं जो अन्यथा शून्य से एक विभाजन का कारण होगा, तो बारी का उपयोग करें उन्हें NULLs में:
राउंड (राशि (मूल्य * घंटे / नलीफ़ (कॉलम 1, 0)), 2)
पोस्टग्रेएसक्यूएल 9.4 एक नया फ़िल्टर शुरू करेगा समुच्चय के लिए खंड, जिसका उपयोग इस उद्देश्य के लिए भी किया जा सकता है:
गोल (राशि (घंटे * घंटे / स्तंभ 1) फिल्टर (जहां कॉलम 1! = 0), 2)
Comments
Post a Comment