2010-07-16 22 views
8

के साथ चयनित कॉलम में मेरे पास एक (बल्कि जटिल) SQL कथन है जहां मैं कई अलग-अलग तालिकाओं से डेटा का चयन करता हूं, और खराब विरासत डेटा संरचना का सामना करने के लिए, मेरे पास कुछ कस्टम हैं कॉलम जो अन्य मानों से मूल्यों के आधार पर अपना मान प्राप्त करते हैं। मैं वर्तमान में CASE बयान के साथ इस समाधान कर लिया है:WHERE क्लॉज में अमान्य कॉलम नाम त्रुटि, CASE

SELECT 
    ..., 
    CASE channel 
     WHEN 1 THEN channel_1 
     WHEN 2 THEN channel_2 
     ... 
     ELSE 0 
    END AS ChannelValue, 
    CASE channelu 
     WHEN 1 THEN channelu_1 
     WHEN 2 THEN channelu_2 
     ... 
     ELSE '0' 
    END AS ChannelWithUnit, 
    ... 
FROM 
    ... 
--rest of statement continues with multiple joins and where/and clauses... 

मैं सभी परिणाम मैं उम्मीद जब एमएस एसक्यूएल सर्वर प्रबंधन स्टूडियो में क्वेरी को क्रियान्वित करने, और के रूप में मैं अपने AS में निर्दिष्ट है स्तंभ नाम सूचीबद्ध हैं मिलता है। हालांकि, किसी कारण से मुझे WHERE कथन में सशर्त मानों का उपयोग करने की अनुमति नहीं है। अगर मैं क्वेरी के अंत में

AND ChannelValue > Limit * p.Percentage/100 

जोड़ने के लिए, मुझे लगता है कि लाइन कह

संदेश 207, स्तर 16, राज्य 1, पंक्ति 152
अमान्य स्तंभ नाम 'ChannelValue' पर एक त्रुटि प्राप्त

इसकी अनुमति क्यों नहीं है? इसके बजाय मुझे क्या करना चाहिए?

उत्तर

11

एसक्यूएल वक्तव्य जहां यह एक उपनाम SELECT सूची में घोषित उपयोग करने के लिए मान्य है का ही हिस्सा ORDER BY खंड है। क्वेरी के अन्य हिस्सों के लिए आपको बस पूरे केस अभिव्यक्ति को दोहराना होगा और यह पहचानने के लिए ऑप्टिमाइज़र पर भरोसा करना चाहिए कि यह वही है।

यदि आप SQL2005 + पर हैं तो आप इस समस्या से बचने के लिए एक सीटीई का उपयोग कर सकते हैं जो कभी-कभी पठनीयता के साथ मदद करता है।

WITH YourQuery As 
(

SELECT 
    Limit, 
    Percentage, 
    CASE channel 
     WHEN 1 THEN channel_1 
     WHEN 2 THEN channel_2 
     ... 
     ELSE 0 
    END AS ChannelValue, 
    CASE channelu 
     WHEN 1 THEN channelu_1 
     WHEN 2 THEN channelu_2 
     ... 
     ELSE '0' 
    END AS ChannelWithUnit, 
    ... 
FROM 
) 

select ... 
FROM YourQuery WHERE 
ChannelValue > Limit * Percentage/100 
7

आप उसी select स्तर पर जहां खंड में ChannelValue कॉलम नाम का उपयोग नहीं कर सकते हैं।
आपको एक सबक्वायरी में यह संपूर्ण select रखना होगा।

select .... 
from 
( 
your select query 
) as innerSelect 
where ChannelValue > Limit * p.Percentage/100 
2

आप एक CTE उपयोग कर सकते हैं -

WITH CTE AS 
(
SELECT 
    ..., 
    CASE channel 
     WHEN 1 THEN channel_1 
     WHEN 2 THEN channel_2 
     ... 
     ELSE 0 
    END AS ChannelValue, 
    CASE channelu 
     WHEN 1 THEN channelu_1 
     WHEN 2 THEN channelu_2 
     ... 
     ELSE '0' 
    END AS ChannelWithUnit, 
    ... 
FROM 
) 
SELECT * 
FROM CTE 
WHERE ChannelValue > Limit * p.Percentage/100 
-2
-- SOMETHING FROM ADVENTURE WORKS THIS WORKS AS THE ABOVE POSTER 
--- USING 'WITH CTE AS' 
-- MY ANSWER TO A QUERY 

WITH CTE AS 
(
SELECT HE.Gender AS [GENDER], HE.HireDate AS [HIREDATE],  HE.BirthDate AS [BIRTHDATE], 
CASE 
WHEN DATEPART(YY,[BIRTHDATE]) BETWEEN 1962 AND 1970 AND [GENDER] = 'M' AND DATEPART(YY,[HIREDATE]) > 2001 THEN 'MALE' 
WHEN DATEPART(YY,[BIRTHDATE]) BETWEEN 1972 AND 1975 AND [GENDER] = 'F' AND DATEPART(YY,[HIREDATE]) BETWEEN 2001 AND 2002 THEN 'FEMALE' 
ELSE 'NOTREQUIRED' 
END AS [RESULT] 
FROM [HumanResources].[Employee] AS HE 
) 
SELECT * 
FROM CTE 
WHERE [RESULT] <> 'NOTREQUIRED' -- GOT THIS TOO WORK NO FEMALES IN RESULT 
ORDER BY [RESULT] 
की तरह कुछ
संबंधित मुद्दे