मुझे लगता है कि मैंने हमेशा यह माना है कि SQL क्वेरी के चयन भाग में स्केलर फ़ंक्शंस केवल उन पंक्तियों पर लागू होंगे जो खंड के सभी मानदंडों को पूरा करते हैं।SQL स्टेटमेंट निष्पादित करते समय फ़िल्टरिंग से पहले स्केलर फ़ंक्शन लागू किए जा सकते हैं?
आज मैं एक विक्रेता से कुछ कोड डीबग कर रहा था और उस धारणा को चुनौती दी गई थी। इस कोड के असफल होने का एकमात्र कारण यह है कि सबस्ट्रिंग() फ़ंक्शन को डेटा पर कॉल किया जा रहा है जिसे WHERE क्लॉज द्वारा फ़िल्टर किया जाना चाहिए था। लेकिन ऐसा प्रतीत होता है कि फ़िल्टरिंग होने से पहले सबस्ट्रिंग कॉल लागू किया जा रहा है, क्वेरी विफल हो रही है। मेरा मतलब यह है कि मेरा क्या मतलब है। आइए मान लें कि हमारे पास दो टेबल हैं, प्रत्येक में 2 कॉलम हैं और क्रमश: 2 पंक्तियां और 1 पंक्ति हैं। प्रत्येक में पहला कॉलम सिर्फ एक आईडी है। NAME सिर्फ एक स्ट्रिंग है, और NAME_LENGTH हमें बताता है कि उसी आईडी वाले नाम में कितने अक्षर हैं। ध्यान दें कि LONG_NAMES तालिका में केवल एक से अधिक वर्ण वाले नामों की एक समान पंक्ति है।
NAMES: ID, NAME
1, "Peter"
2, "X"
LONG_NAMES: ID, NAME_LENGTH
1, 5
मैं एक प्रश्न काट पिछले 3 पत्र के साथ प्रत्येक नाम मुद्रित करने के लिए चाहते हैं, मैं पहली बार कुछ इस तरह (अब के लिए एसक्यूएल सर्वर वाक्य रचना कल्पना करते हुए) की कोशिश कर सकते:
SELECT substring(NAME,1,len(NAME)-3)
FROM NAMES;
मैं जल्द ही होगा पता लगाएं कि यह मुझे एक त्रुटि देगा, क्योंकि जब यह "एक्स" तक पहुंच जाता है तो यह सबस्ट्रिंग कॉल में नकारात्मक संख्या का उपयोग करने का प्रयास करेगा, और यह असफल हो जाएगा। जिस तरह से मेरे विक्रेता ने इसे हल करने का फैसला किया, वह पंक्तियों को फ़िल्टर करके था, जहां काम करने के लिए लेन-3 क्वेरी के लिए स्ट्रिंग बहुत कम थीं। उन्होंने कहा कि एक और मेज पर शामिल होने से यह किया:
SELECT substring(NAMES.NAME,1,len(NAMES.NAME)-3)
FROM NAMES
INNER JOIN LONG_NAMES
ON NAMES.ID = LONG_NAMES.ID;
पहली नज़र में, जैसे कि यह काम हो सकता है कि इस प्रश्न के लग रहा है। शामिल स्थिति किसी भी पंक्तियों को खत्म कर देगी जिनके पास NAME फ़ील्ड सबस्ट्रिंग कॉल विफल होने के लिए पर्याप्त छोटा है।
हालांकि, मैं क्या देख सकते हैं से, एसक्यूएल सर्वर कभी कभी तालिका में सब कुछ के लिए स्ट्रिंग अभिव्यक्ति की गणना करने की कोशिश करेंगे, और तो पंक्तियों को फ़िल्टर करने में शामिल होने के लागू होते हैं। क्या यह इस तरह से होना चाहिए? क्या ऑपरेशन का एक दस्तावेज क्रम है जहां कुछ चीजें होने पर मुझे पता चल सकता है? क्या यह एक विशेष डेटाबेस इंजन या एसक्यूएल मानक के हिस्से के लिए विशिष्ट है? यदि मैंने छोटे नामों को फ़िल्टर करने के लिए मेरी NAMES तालिका पर कुछ अनुमान लगाने का निर्णय लिया है, (जैसे लेन (NAME)> 3), क्या SQL सर्वर भी सबस्ट्रिंग को लागू करने का प्रयास करने के बाद लागू करना चुन सकता है? यदि ऐसा है तो ऐसा लगता है कि एक सबस्ट्रिंग करने का एकमात्र सुरक्षित तरीका इसे चुनने में "केस कब" में लपेटना होगा?
हाँ। ऐसा करने का एकमात्र सुरक्षित तरीका 'केस' है। इस विषय पर एक अच्छे उत्तर के लिए http://stackoverflow.com/questions/5191701/tsql-divide-by-zero-encountered-despite-no-columns-containing-0/5203211#5203211 देखें। लिंक के लिए –
@ मार्टिन धन्यवाद। मैं यह नहीं समझ सका कि इस तरह के प्रश्नों को कैसे खोजा जाए क्योंकि यह एक तरह का सार है। –