मैं जानना चाहता हूं कि SELECT
कथन सूची का हिस्सा उन अभिव्यक्तियों के लिए संभव है जो WHERE
खंड से मेल नहीं खाते पंक्तियों के लिए मूल्यांकन किए गए हैं?कभी-कभी अभिव्यक्तियों का चयन कभी-कभी पंक्तियों के लिए किया जा सकता है जहां WHERE खंड नहीं है?
निष्पादन आदेश documented here से ऐसा प्रतीत होता है कि SELECT
WHERE
के बाद लंबे समय तक का मूल्यांकन किया जाता है, लेकिन मैं एक वास्तविक जीवन क्वेरी नीचे क्वेरी के समान के साथ एक बहुत अजीब समस्या हुई थी।
संदर्भ में डाल करने के लिए, उदाहरण में, SomeOtherTable
एक a_varchar
स्तंभ जो हमेशा code
105 न्यूमेरिक मान शामिल है, लेकिन अन्य कोड के लिए गैर संख्यात्मक मूल्यों हो सकती है।
क्वेरी बयान काम करता है:
SELECT an_id, an_integer FROM SomeTable
UNION ALL
SELECT an_id, CAST(a_varchar AS int)
FROM SomeOtherTable
WHERE code = 105
निम्न क्वेरी डाली करने में असमर्थ रहा बारे में शिकायत a_varchar
int
रहे हैं:
SELECT 1
FROM (
SELECT an_id, an_integer FROM SomeTable
UNION ALL
SELECT an_id, CAST(a_varchar AS int)
FROM SomeOtherTable
WHERE code = 105
) i
INNER JOIN AnotherOne a
ON a.an_id = i.an_id
और अंत में, निम्न क्वेरी काम करता है:
SELECT 1
FROM (
SELECT an_id, an_integer FROM SomeTable
UNION ALL
SELECT
an_id,
CASE code WHEN 105 THEN CAST(a_varchar AS int) ELSE NULL END
FROM SomeOtherTable
WHERE code = 105
) i
INNER JOIN AnotherOne a
ON a.an_id = i.an_id
इसलिए, केवल एक ही स्पष्टीकरण I cou एलडी खोज यह था कि JOIN
के साथ, क्वेरी code <> 105
पर भी CAST(a_varchar AS int)
निष्पादित हो जाती है, इस तरह से क्वेरी को अलग-अलग अनुकूलित किया जाता है।
प्रश्नों एसक्यूएल सर्वर के विरुद्ध 2008
हाँ, भाव (और होगा) मूल्यांकन किया जा सकता कहां खंड की परवाह किए बिना: दूसरे
case
बयान है। जैसा कि आपने स्वयं को खोजा है, केस अभिव्यक्तियों का उपयोग करें। – Arvoदरअसल, इसके बारे में सबसे अजीब चीज यह है कि कॉलम कमी पूरी तरह कॉलम अभिव्यक्तियों के सभी * को समाप्त करनी चाहिए। इसके अलावा यह (दुर्भाग्य से) अप्रत्याशित व्यवहार नहीं है। 'केस' के साथ अभिव्यक्तियों का उचित ब्रैकेटिंग इसके आसपास एसओपी तरीका है (लगभग हमेशा काम करता है)। – RBarryYoung
यदि आप संघ के बिना एक ही समस्या है तो मैं उत्सुक होगा। मुझे एक झुकाव संदेह है कि यूनियन सभी चयन में डेटा प्रकारों का मूल्यांकन कर रहे हैं और एक को वर्चर के रूप में देख रहे हैं और इसे समझने से पहले छोड़कर आप कास्ट कर रहे हैं। जब एक उप प्रश्न के भीतर शामिल थे। तो क्या आप पहले चयन और संघ के बिना कोशिश कर सकते हैं। एक भौतिकीकृत सबक्वायरी बनाने के बजाय, यह एक सीटीई के साथ काम कर सकता है ... – xQbert