2017-01-17 14 views
5

में गणना कॉलम का पुन: उपयोग करें एक चयन कथन में, मैं WHERE खंड में एक गणना कॉलम का पुन: उपयोग करना चाहता हूं। SQLserver में ऐसा करने का कोई तरीका है?WHERE खंड

सरलीकृत उदाहरण:

SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
    WHERE concat(field2, field3) LIKE 'A%' 

वांछित:

कार्य है, लेकिन बार-बार गणना के साथ

SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
    WHERE calc_field LIKE 'A%' 
+0

क्या आप चिंतित हैं कि आपके पहले उदाहरण के साथ गणना दो बार की जा रही है? – AakashM

+0

@AakashM मेरी चिंता न केवल गीले गणना के बारे में है, दो बार किया जाता है (वास्तव में इसके बारे में निश्चित नहीं है। क्या यह आंतरिक रूप से अनुकूलित है?) ... लेकिन अधिक जटिल वक्तव्य में कई बार एक ही कोड को फिर से लिखने के बारे में भी। – MarcM

+0

इस पर निर्भर करते हुए कि आप इसे कितनी बार फ़िल्टर करना चाहते हैं, आप तालिका पर एक गणना कॉलम डाल सकते हैं। – cloudsafe

उत्तर

6

गणना स्तर को उसी स्तर पर पुन: उपयोग करने का कोई तरीका नहीं है SELECT। उपनाम का उपयोग करने के लिए आपको इसे घोंसला करने की आवश्यकता होगी।

SELECT field1 
    , calc_field 
FROM (
    SELECT field1 
     , CONCAT (field2, field3) AS calc_field 
    FROM MyTable 
    ) tbl 
WHERE calc_field LIKE 'A%' 

This is because of the order in which clauses are executed in a SQL query। जैसा कि आप खंडों के सूचीबद्ध तरीके से देख सकते हैं, SELECT खंड, जहां उपनाम उत्पन्न होता है, WHERE खंड के बाद निष्पादित किया जाता है।

इस प्रकार, उपनाम WHERE खंड में "दृश्यमान" नहीं है, क्योंकि WHERE लागू होने के बाद उपनाम उत्पन्न होता है।

3

यह लपेटें ऊपर एक व्युत्पन्न तालिका में:

select field1, calc_field 
from 
(
    SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
) dt 
WHERE calc_field LIKE 'A%' 
0

एसक्यूएल सर्वर के लिए आप + संयोजन पहचानकर्ता

SELECT field1, field2 +field3 AS calc_field 
 
    FROM MyTable 
 
    WHERE field2 + field3 LIKE 'A%'

बेहतर प्रदर्शन से बचने के लिए के रूप में श्रेणीबद्ध फ़ील्ड का उपयोग कहां खंड में उपयोग कर सकते हैं।

select field1, calc_field from 
(SELECT field1, concat(field2, field3) AS calc_field FROM MyTable 
) as dt 
WHERE calc_field LIKE 'A%' 
1

इस परिणाम प्राप्त करने के उप क्वेरी का उपयोग हो सकता है एक सामान्य टेबल अभिव्यक्ति (सीटीई) का उपयोग करने के लिए:

WITH cte AS (
    SELECT field1, concat(field2, field3) AS calc_field 
    FROM mytable 
) 
SELECT field1, calc_field 
FROM cte 
WHERE calc_field LIKE 'A%' 
2

मौजूदा उत्तरों की एक और भिन्नता है: अपनी आवश्यकताओं पर निर्भर करता है, जहां (जैसे field2 'ए%' या फ़ील्ड 3 की तरह 'ए%') एक बेहतर विकल्प

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