2012-03-26 8 views
7

तो कहते हैं कि मैं इसक्लॉज में चयनित खंड से कॉलम नंबर का उपयोग करें। निकाला जा रहा है allias मूल नाम

SELECT a as d,b,c FROM myTable 
    WHERE a=1; 

की तरह एक प्रश्न यह के बजाय संभव है देता है एक = 1 SELECTED.1 की तरह कुछ टाइप करने के लिए = 1 या किसी भी तरह allias घ के बाद से मूल नाम निकालने के लिए = 1 काम नहीं करता

+3

आप ऐसा क्यों करना चाहते हैं? –

+1

@ जॉन सैंडर्स, क्योंकि शायद एलियाड की बात एक जटिल अभिव्यक्ति है कि आप कहां से खंड में दोहराना नहीं चाहते हैं। –

उत्तर

10

WHERE क्लॉज का मूल्यांकन होने के बारे में आंतरिक जटिलताओं के कारण ऐसा करना संभव नहीं है। लेकिन अगर आप जिस चीज को अलियासिंग कर रहे हैं वह एक लंबी अभिव्यक्ति है जिसे आप दोहराना नहीं चाहते हैं, तो इसका एक सामान्य समाधान है। https://forums.oracle.com/forums/thread.jspa?threadID=1107532 से:

यह करने के लिए मानक समाधान है, आप एक इनलाइन दृश्य में क्वेरी के लिए कदम (जहां-खंड विधेय के बिना), और फिर जहां-खंड विधेय जोड़ें, उपनाम का उपयोग, में बाहरी क्वेरी

तो कुछ इस तरह:

select ... 
from (select ... here complex expression that is aliased ... 
     from ... 
     where) A 
where ... here condition that uses the A.alias column ... 

अपने उदाहरण मामले में, कि होगा:

SELECT d, b, c 
FROM (SELECT a AS d, b, c FROM myTable) AS myAliasedTable 
WHERE d = 1 

लेकिन निश्चित रूप से, यह अपने शाब्दिक उदाहरण में कोई मतलब नहीं होगा। यदि आप जिस चीज को अलियासिंग कर रहे हैं वह सिर्फ एक कॉलम नाम है, तो WHERE में वास्तविक कॉलम नाम का उपयोग करें, उस मामले में कोई वास्तविक दोष नहीं।

यह भी ध्यान दें कि यदि आप इस विधि का उपयोग करते हैं, तो आपको आंतरिक क्वेरी में जितना अधिक हो सकता है उतना ही WHERE क्लॉज डालना चाहिए (जिसका मतलब है कि वे हिस्सों जो एलियाड कॉलम का संदर्भ नहीं देते हैं) परिणामस्वरूप आकार को सीमित करने के लिए अलियाड टेबल उदाहरण के लिए, यदि आप भी अपने उदाहरण में b पर परीक्षण करने के लिए चाहता था, कि होगा:

SELECT d, b, c 
FROM (
    SELECT a AS d, b, c 
    FROM myTable 
    WHERE b = 1 
) AS myAliasedTable 
WHERE d = 1