2013-02-20 33 views
5

मेरे पास एक प्रश्न है और शायद यह सरल है (आपके लिए गुरु)।गतिशील MySQL जहां संग्रहित प्रक्रिया में क्लॉज

मैं अपनी एसक्यूएल पेजिंग कक्षा को सी # से एक MySQL संग्रहीत प्रक्रिया में स्थानांतरित कर रहा हूं। मेरे सी # घर से बने ऑब्जेक्ट में, क्वेरी गतिशील रूप से एक मानदंड के आधार पर बनाई गई है। उदाहरण:

if(keywords is not null) 
{ 
    whereClause += "WHERE description LIKE '%keywords%'" 
} 
if(price is not null) 
{ 
    whereClause += "AND price = '%price%'" 
} 

....

string query = "SELECT col1, col2 FROM tblThreads " + whereClause 

अब, मेरे सवाल है: मैं कैसे MySQL में एक गतिशील जहां खंड इस के समान क्या करते हो? या, अगर वे उन मानकों के लिए कुछ भी दर्ज नहीं करते हैं, तो मैं उनको छोड़ने के लिए संग्रहीत प्रक्रिया में MySQL कैसे बताऊंगा? आईई:

SELECT col1, col2 FROM tblThreads 

क्या यह पैरामीटर शून्य होगा यदि यह पैरामीटर शून्य था?

SELECT col1, col2 FROM tblThreads WHERE (IS NULL @keywords OR description like '%@keywords%' 

??

धन्यवाद दोस्तों।

उत्तर

1

सबसे आसान तरीका है अगर आप उन्हें पूरे डेटाबेस क्वेरी करने के लिए अनुमति दे रहे हैं बस आप @keywords का मूल्य, उदाहरण के लिए जाँच करने के लिए CASE बयान उपयोग कर सकते हैं की तरह

whereClause = "WHERE 1 = 1" 

if(keywords is not null) 
{ 
whereClause += "AND description LIKE '%keywords%'" 
} 
if(price is not null) 
{ 
whereClause += "AND price = '%price%'" 
} 
+0

मैं इस एक पसंद है। मैं इसे स्वयं उपयोग करता हूं, क्योंकि जब मुझे SQL कथन का "भारी" पार्सिंग करना होता है, यानी प्रोग्रामेटिक रूप से निकालना और खंड। आपको 'पिछले पर वापस जाएं' और ", और उस पंक्ति को हटा दें, इत्यादि। WHERE क्लॉज को डिस्काउंट करना इतना आसान बनाता है। –

+0

मैंने इसे एक बार पहले देखा था, और भले ही यह मेरे मूल प्रश्न का उत्तर नहीं देता है, यह दिलचस्प है। मान लीजिए कि मैं अपने सी # ऑब्जेक्ट क्लास पर चिपक गया हूं, अभी मैं यह पहचानने की कोशिश कर रहा हूं कि मैं "एंड" का उपयोग कर रहा हूं (मेरे पास एक बुलियन वैरिएबल है जो कि मैं जिस पल का उपयोग करता हूं, उस पर सही है।) मान लीजिए कि मैं ऐसा करता हूं, मैं चाहता हूं जब मैंने अपना पहला पैरामीटर इस्तेमाल किया, तो सही ट्रैक करना होगा? क्या इसमें कोई प्रदर्शन जुर्माना है और क्या 1 = 1 किसी भी मुद्दे का कारण बनता है? –

+0

बस कुछ अतिरिक्त विवरण यहां देखे गए: http://stackoverflow.com/questions/8149142/where-1-1-statement मुझे वास्तव में यह विचार पसंद है और इसे लागू करने का प्रयास करेंगे। पारितोषिक के लिए धन्यवाद! अगर मैं उस एवेन्यू को आगे बढ़ाने का फैसला करता हूं तो मैं इस विधि का उपयोग करके अंततः अपनी संग्रहीत प्रक्रिया का निर्माण भी कर सकता हूं। धन्यवाद दोस्तों। –

2

अपने बयान कुछ करने के लिए एक 1 = 1 जोड़ने के लिए है ।

SELECT col1, col2 
FROM tblThreads 
WHERE description LIKE CASE WHEN @keywords IS NULL 
          THEN description 
          ELSE CONCAT('%', @keywords, '%') 
          END 
     AND 
     price LIKE CASE WHEN @price IS NULL 
          THEN price 
          ELSE CONCAT('%', @price, '%') 
          END 
+0

क्या होता है यदि सभी पैरामीटर शून्य हैं? क्या वह खराब निष्पादन के लिए नहीं होगा? आईई: विवरण '%%' और मूल्य की तरह '%%' और param3 पसंद '%%' और ... paramX पसंद '%%'? –

+0

मेरी आखिरी टिप्पणी को अनदेखा करें। यदि मैं 1 = 1 विधि करता हूं, तो 'केस जब @price <> न्यूल और मूल्य की तरह'% मूल्य% '' काम करना चाहिए, मुझे लगता है कि मैं अनुमान लगा रहा हूं ... मैं' मैंने कभी कोशिश नहीं की, इसलिए यह अनुमान है। –

0
SELECT col1, col2 
FROM tblThreads 
WHERE case when @keywords is not null then description like '%' + @keywords + '%' when @price is not null then price like'%' + @price + '%' end