ठीक है, पंद्रह सशर्त कॉलम प्रश्न:WHERE खंड में कॉलम पर सशर्त रूप से फ़िल्टर कैसे करें?
मैं एक संग्रहित प्रो लिख रहा हूं जो एक इनपुट पैरामीटर लेता है जो कई ध्वज स्तंभों में से एक में मैप किया गया है। अनुरोधित कॉलम पर फ़िल्टर करने का सबसे अच्छा तरीका क्या है? मैं वर्तमान में SQL2000 पर हूं, लेकिन SQL2008 पर जाने के बारे में, इसलिए यदि कोई उपलब्ध है तो मैं एक समकालीन समाधान लेगा।
तालिका sproc में पूछे लगता है कि
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
और मैं
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
की तरह कुछ करना चाहता हूँ, इसलिए यदि मैं exec uspMyProc @flag = 'foo'
तरह sproc फोन मैं वापस पंक्तियों 1 और 4 प्राप्त होता
मुझे पता है कि मैं सीधे एसक्यूएल में माता-पिता में हिस्सा नहीं कर सकता। गतिशील एसक्यूएल करने के लिए, मुझे पूरी क्वेरी को स्ट्रिंग में भरना होगा, WHERE क्लॉज में @flag param को संयोजित करना होगा और फिर स्ट्रिंग को निष्पादित करना होगा। गंदे लगने के अलावा मुझे गतिशील एसक्यूएल करने के दौरान मिलता है, मेरी क्वेरी काफी बड़ी है (मैं दो दर्जन फ़ील्ड का चयन कर रहा हूं, 5 टेबल में शामिल हो रहा हूं, कुछ कार्यों को बुला रहा हूं), इसलिए यह एक पंक्ति के कारण एक बड़ी विशाल स्ट्रिंग है एक 3-लाइन WHERE फ़िल्टर में।
वैकल्पिक रूप से, मेरे पास क्वेरी की 4 प्रतियां हो सकती हैं और CASE कथन में उनके बीच चयन कर सकती हैं। यह एसक्यूएल कोड सीधे निष्पादन योग्य (और सिंटैक्स हाइलाइटिंग इत्यादि के अधीन) छोड़ देता है लेकिन कोड के बड़े हिस्से को दोहराने की लागत पर, क्योंकि मैं केवल WHERE क्लॉज पर CASE का उपयोग नहीं कर सकता।
क्या कोई अन्य विकल्प हैं? कोई भी मुश्किल जुड़ता है या तार्किक संचालन लागू किया जा सकता है? या मुझे बस इसे खत्म करना चाहिए और गतिशील एसक्यूएल निष्पादित करना चाहिए?
आप एक मामले बयान के साथ ऐसा कर सकते हैं:
"exec uspMyProc @flag = 'foo' मैं पंक्ति 1 वापस प्राप्त करूंगा।" क्यों केवल पंक्ति 1 और पंक्ति 4 भी नहीं? –
@ मार्क - डी ओह, हाँ, तय! – Val