2016-03-07 3 views
5

क्या कहां स्थितियों के लिए आदेश स्पष्ट रूप से बताए जाने का कोई तरीका है? मुझे लगता है कि क्वेरी अनुकूलक कहां खंड के सभी भागों में के रूप में इन उत्तरों में कहा गया है देखो, क्वेरी संतुष्ट करने के लिए सबसे कारगर तरीका निर्धारित करने के लिए होगा:एसक्यूएल - कहां स्थितियों का स्पष्ट आदेश?

Does order of where clauses matter in SQL

SQL - Does the order of WHERE conditions matter?

हालांकि, वहाँ है किसी शर्त की जांच करने का कोई तरीका नहीं है कि अन्य स्थितियों पर भरोसा होगा? उन धागे से जवाब में से एक है कि मैं क्या कर रहा हूँ के बाद पर छू लेती है, लेकिन एक समाधान की पेशकश नहीं करता है:

select * 
from INFORMATION_SCHEMA.TABLES 
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0 

यह असफल हो सकता है क्योंकि कास्ट निर्धारित करता है कि TABLE_NAME फ़ील्ड संख्यात्मक है से पहले मूल्यांकन किया जा सकता है (और इसलिए अवैध कास्टिंग के लिए एक त्रुटि फेंक दें)।

निश्चित रूप से इसे प्राप्त करने का एक तरीका होना चाहिए?

उत्तर

4

जैसे एक व्युत्पन्न तालिका का उपयोग करना:

SELECT* 
FROM(
    select * 
    from INFORMATION_SCHEMA.TABLES 
    where ISNUMERIC(table_name) = 1 
) AS i 
WHERE CAST(table_name as int) <> 0 

वैकल्पिक रूप से, और क्रम में सबसे अधिक संभावना रन, आप एक मामला बयान का उपयोग कर सकते हैं:

select * 
from INFORMATION_SCHEMA.TABLES 
where 0<>(CASE WHEN ISNUMERIC(table_name) = 1 
      THEN CAST(table_name as int) 
      ELSE 0 END) 

यह है कि ध्यान दिया जाना चाहिए एसक्यूएल सर्वर (एकमात्र आरडीबीएमएस जो मैंने एक्सप किया है) वहां ऐसी स्थितियां मौजूद हैं जहां सीएएसई-चाल विफल हो जाएगी।

मामला बयान इसकी स्थितियों से क्रमिक रूप से मूल्यांकन करता है और पहली शर्त जिसका शर्त पूरी होने के साथ बंद हो जाता है: documentation on CASE, Remarks देखें। कुछ स्थितियों में, किसी CASE कथन से पहले अभिव्यक्ति का परिणाम मूल्यांकन के परिणाम प्राप्त होने से पहले एक अभिव्यक्ति का मूल्यांकन किया जाता है। इन अभिव्यक्तियों का मूल्यांकन करने में त्रुटियां संभव हैं। जब कोई CASE कथन में तर्क होता है तो कुल अभिव्यक्तियों का मूल्यांकन पहले किया जाता है, फिर CASE कथन में प्रदान किया जाता है। उदाहरण के लिए, MAX क्वेरी के मान का उत्पादन करते समय निम्न क्वेरी शून्य त्रुटि से विभाजित करती है। यह CASE अभिव्यक्ति का मूल्यांकन करने से पहले होता है।

WITH Data (value) AS 
( 
SELECT 0 
UNION ALL 
SELECT 1 
) 
SELECT 
    CASE 
     WHEN MIN(value) <= 0 THEN 0 
     WHEN MAX(1/value) >= 100 THEN 1 
    END 
FROM Data ; 

मैं शक कर रहा हूँ यह भी अन्य आरडीबीएमएस कार्यान्वयन के लिए सच हो सकता है।

+1

सुंदर नहीं है, लेकिन मैं इसे ले जाऊंगा। धन्यवाद! – McFixit

1

मुझे लगता है कि आप अगर मूल्यांकन शॉर्ट सर्किट कर सकते हैं पूछ रहे हैं - यह इस पढ़ने के लिए मदद कर सकता है:

Is the SQL WHERE clause short-circuit evaluated?

तो, आप शायद दूसरा प्रयास करने से पहले स्थिति का मूल्यांकन करने की जरूरत है। एमएसएसक्यूएल में, आप पहले करने के लिए एक सीटीई का उपयोग कर सकते हैं। या, एक और विकल्प कुछ मामलों के तहत केवल दूसरे को करने के लिए केस का उपयोग करना हो सकता है।

संबंधित मुद्दे