दिलचस्प पोस्ट
Google App इंजन के पेशेवरों और विपक्ष .git निर्देशिका वेब दुर्गम बनाओ जर्सी क्लाइंट का उपयोग कर HTTPS जावास्क्रिप्ट: Ajax के साथ JSON ऑब्जेक्ट भेजें? दो नक्शे मर्ज करने और एक ही कुंजी के मूल्यों का योग करने का सर्वोत्तम तरीका है? विंडोज नीला: एक ब्लॉब कंटेनर में उप निर्देशिका कैसे तैयार करें Google ने ऐसा करने के लिए कैसे प्रबंधित किया? एंड्रॉइड एप्लिकेशन में एक्शनबार स्लाइड करें MySQL – दो दिनांक के बीच डेटाबेस से डेटा का चयन करें पायथन – उद्धरण अंकों के अंदर उद्धरण चिह्नों का उपयोग करना .NET के लिए स्वत: अद्यतन लाइब्रेरी? आज की तारीख के साथ मैं कैसे एक jQuery Datepicker पाठ बॉक्स पूर्व-पॉप्यूलेट? कोड में एंड्रॉयड सेट शैली ओपनसीवी में अर्द्ध-सर्कल का पता लगाएं जावास्क्रिप्ट – रीसेट सेट इन्स्टर्वल वापस 0 पर मैं विजुअल स्टूडियो 2013 से गिटहब के लिए एक मौजूदा समाधान कैसे जोड़ूं?

एसक्यूएल में "शून्य से विभाजित" त्रुटि से कैसे बचें?

मेरे पास यह त्रुटि संदेश है:

Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered. 

एसक्यूएल कोड लिखने का सबसे अच्छा तरीका क्या है ताकि मैं इस त्रुटि संदेश को फिर कभी नहीं देख सकूं?

मैं निम्नलिखित में से कोई भी कर सकता हूं:

  • जहां एक खंड जोड़ें ताकि मेरे विभाजक शून्य न हो

या

  • मैं एक केस स्टेटमेंट जोड़ सकता हूं, ताकि शून्य के लिए एक विशेष उपचार हो।

क्या नल आइफ़ क्लॉज का उपयोग करने का सबसे अच्छा तरीका है?

क्या बेहतर तरीका है, या यह कैसे लागू किया जा सकता है?

वेब के समाधान से एकत्रित समाधान "एसक्यूएल में "शून्य से विभाजित" त्रुटि से कैसे बचें?"

"शून्य से डिवीजन" त्रुटि से बचने के लिए हमने इसे इस तरह क्रमादेशित किया है:

 Select Case when divisor=0 then null Else dividend / divisor End ,,, 

लेकिन यह करने का एक बहुत अच्छा तरीका है:

 Select dividend / nullif(divisor, 0) ... 

अब एकमात्र समस्या यह है कि अगर मैं "/" कुंजी का उपयोग करता हूँ, तो NullIf बिट को याद रखना है

यदि आप शून्य लौटना चाहते हैं, तो शून्य विचलन होगा, तो आप इसका उपयोग कर सकते हैं:

 SELECT COALESCE(dividend / NULLIF(divisor,0), 0) FROM sometable 

शून्य के हर विभाजक के लिए, आपको परिणाम सेट में शून्य प्राप्त होगा।

ऐसा लगता है कि मेरी स्थिति के लिए शून्य से विभाजित करने का प्रयास करते समय मेरी स्थिति में सबसे अच्छा तय होता है, जो मेरे डेटा में होता है।

मान लीजिए आप विभिन्न स्कूल क्लबों के लिए पुरुष-महिला अनुपात की गणना करना चाहते हैं, लेकिन आपको पता चलता है कि निम्न प्रश्न विफल हो गए हैं और एक विभाजन-शून्य-शून्य त्रुटि का सामना करते हैं, जब वह रिंग्स क्लब के प्रभु के अनुपात की गणना करने की कोशिश करता है, जिसमें कोई महिला नहीं है :

 SELECT club_id, males, females, males/females AS ratio FROM school_clubs; 

शून्य द्वारा विभाजन से बचने के लिए आप फ़ंक्शन NULLIF का उपयोग कर सकते हैं। NULLIF दो भावों की तुलना करता है और यदि वे बराबर या पहली अभिव्यक्ति अन्यथा हैं, तो अशक्त लौटाता है।

क्वेरी को इस रूप में लिखना:

 SELECT club_id, males, females, males/NULLIF(females, 0) AS ratio FROM school_clubs; 

NULL विभाजित कोई भी नंबर NULL प्रदान करता NULL , और कोई त्रुटि उत्पन्न नहीं होती है।

आप यह क्वेरी की शुरुआत में भी कर सकते हैं:

 SET ARITHABORT OFF SET ANSI_WARNINGS OFF 

तो अगर आपके पास कुछ ऐसा है जो 100/0 जैसा है 100/0 यह नल वापस आएगा। मैंने केवल साधारण प्रश्नों के लिए यह किया है, इसलिए मुझे नहीं पता कि यह लंबे समय तक / जटिल लोगों को कैसे प्रभावित करेगा।

संपादित करें: मुझे हाल ही में इस पर बहुत अधिक डाउनवॉश मिल रही है … इसलिए मैंने सोचा कि मैं सिर्फ एक नोट जोड़ूंगा कि यह उत्तर सवाल से पहले लिखा गया था, यह सबसे हाल ही में संपादित किया गया था, जहां एक विकल्प के रूप में रिक्त स्थान वापस लाया गया था .. जो बहुत स्वीकार्य लगता है। मेरे कुछ जवाब एडवर्डो की तरह चिंताओं को संबोधित किया गया था, टिप्पणियों में, जो 0 लौटने की वकालत करते हुए प्रतीत होता था। यह मामला है मैं इसके खिलाफ रेलिंग कर रहा था।

उत्तरः मुझे लगता है कि यहां एक अंतर्निहित मुद्दा है, जो कि 0 के द्वारा विभाजन कानूनी नहीं है। यह एक ऐसा संकेत है कि कुछ चीज गलत रूप से गलत है यदि आप शून्य से विभाजित हैं, तो आप कुछ ऐसा करने की कोशिश कर रहे हैं जो गणितीय रूप से समझ नहीं पा रहा है, इसलिए आपको प्राप्त होने वाले कोई भी संख्यात्मक उत्तर वैध नहीं होगा। (इस मामले में अशक्त का उपयोग उचित है, क्योंकि यह एक ऐसा मान नहीं है जो बाद में गणितीय गणना में उपयोग किया जाएगा)।

तो एडवर्डो ने टिप्पणी में पूछा "क्या होगा अगर उपयोगकर्ता 0 में डालता है?", और वह वकालत करता है कि बदले में 0 प्राप्त करने के लिए ठीक होना चाहिए। यदि उपयोगकर्ता राशि में शून्य डालता है, और यदि वे ऐसा करते हैं तो आपको 0 लौटा देना चाहते हैं, तो आपको उस मूल्य को पकड़ने के लिए व्यावसायिक नियम स्तर पर कोड डालना चाहिए और 0 लौटकर … कुछ विशेष केस नहीं होगा जहां विभाजन 0 = 0।

यह एक सूक्ष्म अंतर है, लेकिन यह महत्वपूर्ण है … क्योंकि अगली बार जब कोई व्यक्ति आपके कार्य को कहता है और उसे सही काम करने की उम्मीद करता है, और यह कुछ दिखलाना करता है जो गणितीय सही नहीं है, लेकिन विशेष किनारे के मामले को संभालती है बाद में किसी को काटने का अच्छा मौका आप वास्तव में 0 से विभाजित नहीं हो रहे हैं … आप एक बुरे प्रश्न के लिए सिर्फ एक बुरे उत्तर लौट रहे हैं।

कल्पना कीजिए कि मैं कुछ कोडिंग कर रहा हूं, और मैंने इसे स्क्रू कर दिया। मुझे एक विकिरण माप स्केलिंग मान में पढ़ना चाहिए, लेकिन एक अजीब बढ़त के मामले में मुझे आशा नहीं थी, मैंने 0. में पढ़ा था। तब मैं अपने मूल्य को अपने फ़ंक्शन में छोड़ देता हूं … आप मुझे 0 लौटाते हैं! हुर्रे, कोई विकिरण नहीं! सिवाय यह वास्तव में वहाँ है और यह सिर्फ इतना है कि मैं एक खराब मूल्य में गुजर रहा था … लेकिन मुझे पता नहीं है। मैं विभाजन को त्रुटि फेंकना चाहता हूं क्योंकि यह झंडा है कि कुछ गलत है

आप कम से कम त्रुटि को तोड़ने से क्वेरी को रोक सकते हैं और शून्य से एक विभाजन कर सकते हैं, तो शून्य लौटा सकते हैं:

 SELECT a / NULLIF(b, 0) FROM t 

हालांकि, मैं इसे ज़ीरो के साथ coalesce कभी भी कन्वर्ट नहीं करता था , जैसे कि उस अन्य उत्तर में दिखाया गया है जिसमें कई अपवोट मिले। यह गणितीय अर्थों में पूरी तरह से गलत है, और यह भी खतरनाक है क्योंकि आपके आवेदन की संभावना गलत और भ्रामक परिणाम वापस आ जाएगी।

 SELECT Dividend / ISNULL(NULLIF(Divisor,0),1) AS Result 

मैंने अपनी संग्रहीत कार्यविधियों के लिए उसे संभालने के लिए कुछ समय पहले एक फ़ंक्शन लिखी थी:

 print 'Creating safeDivide Stored Proc ...' go if exists (select * from dbo.sysobjects where name = 'safeDivide') drop function safeDivide; go create function dbo.safeDivide( @Numerator decimal(38,19), @divisor decimal(39,19)) returns decimal(38,19) begin -- ************************************************************************** -- Procedure: safeDivide() -- Author: Ron Savage, Central, ex: 1282 -- Date: 06/22/2004 -- -- Description: -- This function divides the first argument by the second argument after -- checking for NULL or 0 divisors to avoid "divide by zero" errors. -- Change History: -- -- Date Init. Description -- 05/14/2009 RS Updated to handle really freaking big numbers, just in -- case. :-) -- 05/14/2009 RS Updated to handle negative divisors. -- ************************************************************************** declare @p_product decimal(38,19); select @p_product = null; if ( @divisor is not null and @divisor <> 0 and @Numerator is not null ) select @p_product = @Numerator / @divisor; return(@p_product) end go 
  1. एक चेक बाधा जोड़ें, जो Divisor को गैर-शून्य करने के लिए बाध्य करता है
  2. फॉर्म के लिए एक मान्यकर्ता जोड़ें ताकि उपयोगकर्ता इस क्षेत्र में शून्य मान दर्ज नहीं कर सके।

अद्यतन एसक्यूएल के लिए:

 update Table1 set Col1 = Col2 / ISNULL(NULLIF(Col3,0),1) 

कोई जादुई वैश्विक सेटिंग '0 अपवाद बंद करके मोड़ विभाजन' है ऑपरेशन को फेंकना होगा, चूंकि एक्स / 0 का गणितीय अर्थ शून्य से अलग है, इसलिए यह शून्य नहीं लौटा सकता। मुझे लगता है कि आप स्पष्ट का ख्याल रख रहे हैं और आपके प्रश्नों में ऐसी स्थितियां हैं जिन्हें 1 विभाजक के साथ रिकॉर्ड को समाप्त करना चाहिए और विभाजन का मूल्यांकन कभी नहीं करना चाहिए। सबसे अधिक 'डेवलपर्स' की तुलना में सबसे डेवलपर्स की अपेक्षा एसक्यूएल को प्रक्रियात्मक भाषाओं की तरह व्यवहार करना और लॉजिकल ऑपरेटर शॉर्ट सर्किट की पेशकश करना है, लेकिन यह नहीं है । मैं आपको इस लेख को पढ़ने की सलाह देता हूं: http://www.sqlmag.com/Articles/ArticleID/9148/pg/2/2.html

जहां एक खंड का उपयोग करते हुए डेटा को फ़िल्टर करें, ताकि आपको 0 मान न मिले।

यहाँ एक स्थिति है जहां आप शून्य से विभाजित कर सकते हैं। व्यापार नियम यह है कि इन्वेंट्री की गणना करने के लिए, आप किसी अवधि के लिए बेचए गए सामानों की लागत लेते हैं, इसका वार्षिककरण करें आपके पास वार्षिक संख्या के बाद, आप अवधि के लिए औसत इन्वेंट्री से विभाजित करते हैं।

मैं इन्वेंट्री की संख्या की गणना कर रहा हूं जो तीन महीने की अवधि में घट जाती है। मैंने यह अनुमान लगाया है कि मेरे पास 1,000 डॉलर की तीन महीने की अवधि के दौरान बेचा माल की कीमत है बिक्री की वार्षिक दर $ 4,000 ($ 1,000 / 3) * 12 है शुरुआत सूची 0 है। अंत की सूची 0 है। मेरी औसत इन्वेंट्री अब 0 है। मेरे पास प्रति वर्ष 4000 डॉलर की बिक्री है, और कोई सूची नहीं है। इससे मुनाफे की एक अनंत संख्या पैदा होती है इसका मतलब यह है कि मेरे सारे इन्वेंट्री ग्राहकों द्वारा परिवर्तित और खरीदे जा रहे हैं।

यह एक व्यवसायिक नियम है कि इन्वेंट्री की गणना कैसे की जाती है

 CREATE FUNCTION dbo.Divide(@Numerator Real, @Denominator Real) RETURNS Real AS /* Purpose: Handle Division by Zero errors Description: User Defined Scalar Function Parameter(s): @Numerator and @Denominator Test it: SELECT 'Numerator = 0' Division, dbo.fn_CORP_Divide(0,16) Results UNION ALL SELECT 'Denominator = 0', dbo.fn_CORP_Divide(16,0) UNION ALL SELECT 'Numerator is NULL', dbo.fn_CORP_Divide(NULL,16) UNION ALL SELECT 'Denominator is NULL', dbo.fn_CORP_Divide(16,NULL) UNION ALL SELECT 'Numerator & Denominator is NULL', dbo.fn_CORP_Divide(NULL,NULL) UNION ALL SELECT 'Numerator & Denominator = 0', dbo.fn_CORP_Divide(0,0) UNION ALL SELECT '16 / 4', dbo.fn_CORP_Divide(16,4) UNION ALL SELECT '16 / 3', dbo.fn_CORP_Divide(16,3) */ BEGIN RETURN CASE WHEN @Denominator = 0 THEN NULL ELSE @Numerator / @Denominator END END GO 

आप त्रुटि को उचित तरीके से संभालने के लिए कर सकते हैं जब वह कॉलिंग प्रोग्राम को वापस चला जाता है (या इसे अनदेखा करें यदि आप चाहते हैं)। सी # में SQL में होने वाली कोई भी त्रुटि एक अपवाद फेंक देगी कि मैं किसी भी अन्य त्रुटि की तरह मेरे कोड में पकड़ कर संभाल सकता हूं।

मैं बस्का से सहमत हूँ कि आप त्रुटि को छिपाना नहीं चाहते हैं आप परमाणु रिएक्टर के साथ काम नहीं कर सकते हैं, लेकिन सामान्य तौर पर त्रुटियों को छिपाते हुए खराब प्रोग्रामिंग अभ्यास करना पड़ता है। यह एक कारण है कि सबसे आधुनिक प्रोग्रामिंग भाषाओं को एक त्रुटि / स्थिति कोड के साथ वास्तविक रिटर्न मूल्य को कम करने के लिए संरचित अपवाद हैंडलिंग लागू है। यह विशेष रूप से सच है जब आप गणित कर रहे हैं सबसे बड़ी समस्या यह है कि आप एक त्रुटि के परिणाम के रूप में सही गणना किए गए 0 या वापस 0 के बीच भेद नहीं कर सकते। इसके बदले किसी भी मूल्य को गणना की गई मूल्य है और अगर कुछ गलत हो जाता है तो अपवाद फेंक दिया जाता है। यह निश्चित रूप से भिन्न होगा कि आप डेटाबेस को कैसे उपयोग कर रहे हैं और आप किस भाषा का उपयोग कर रहे हैं, लेकिन आपको हमेशा एक त्रुटि संदेश प्राप्त करने में सक्षम होना चाहिए जो आप से निपट सकते हैं।

 try { Database.ComputePercentage(); } catch (SqlException e) { // now you can handle the exception or at least log that the exception was thrown if you choose not to handle it // Exception Details: System.Data.SqlClient.SqlException: Divide by zero error encountered. } 

NULLIF(exp,0) उपयोग करें NULLIF(exp,0) लेकिन इस तरह – NULLIF(ISNULL(exp,0),0)

NULLIF(exp,0) टूट जाता है यदि exp null लेकिन NULLIF(ISNULL(exp,0),0) तोड़ नहीं जाएगा