2012-11-01 7 views
10

अगर मैं की तरह एक प्रश्न है: जब मैं यह करता है, तो हालत की वजह से त्रुटि दे रहा है की तरह का उपयोगSql सर्वर संघ के साथ हालत

DECLARE @tmpValue 
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
IF @tmpValue > 0 
SELECT * FROM Animal WHERE.Active = 0 

। मुझे अपनी संरचना के कारण यूनियन का उपयोग करना होगा।

यदि मैं इस स्थिति के साथ इसका उपयोग कैसे कर सकता हूं?

धन्यवाद,
जॉन

उत्तर

14

तो जैसे WHERE खंड के हालत @tmpValue > 0 ले जाएँ:

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal WHERE @tmpValue > 0 AND Active = 0 
3

आप इस तरह जिज्ञासा के लिए आपके शर्त जोड़ सकते हैं। संघ की धारा हिस्सा बस कोई परिणाम वापस आ जाएगी, तो अपने परीक्षण हालत झूठी है: क्वेरी में हालत डाल करने के लिए

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal WHERE.Active = 0 and @tmpValue > 0 
3

सबसे अच्छा तरीका है मामला बयान है। आप क्वेरी में की किसी भी स्थिति को डाल सकते हैं। केस स्टेटमेंट क्वेरी में सशर्त फ़िल्टर डालने के लिए प्रयोग किया जाता है।

EX के लिए।

DECLARE @tmpValue 
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal 
WHERE 
1 = CASE WHEN @tmpValue = 0 THEN 0 ELSE Active = 1 END 

आपकी स्थिति जटिल नहीं है लेकिन अधिक जटिल स्थिति के लिए आप क्वेरी में नेस्टेड केस स्टेटमेंट का उपयोग कर सकते हैं।

0

यहां ऐसा करने का तरीका है जो पूरी तरह से यूनियन से छुटकारा पाने के द्वारा कोड को सरल बनाता है। जहां भी संभव हो मैं हमेशा एक सरल समाधान पसंद करते हैं। यदि चयन तालिका स्कैन करता है तो यह बेहतर प्रदर्शन करेगा, क्योंकि यह केवल दो बार संभावित रूप से इसे स्कैन करेगा।

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 OR @tmpValue > 0 
संबंधित मुद्दे