2011-12-01 10 views
9

मेरे पास एक एएसपीनेट वेब एप्लिकेशन है जिसके लिए एक खोज पृष्ठ की आवश्यकता है जो किसी विशिष्ट तालिका (SQL) में डेटा की खोज करता है। आज यह केवल एक साधारण जैसी क्वेरी है, parametized एसक्यूएल का उपयोग:तार्किक ऑपरेटरों के साथ एसक्यूएल खोज

SqlParameter[] param = new SqlParameter[1]; 

param[0] = new SqlParameter("@searchText", SqlDbType.VarChar); 
param[0].Value = "%" + text + "%"; 

using (SqlDataReader dr = SqlHelper.ExecuteReader(this.ConnectionString, CommandType.StoredProcedure, "isp_Search", param)) 
{ 
     //Do something 
} 

अब मैं खोज करने के लिए तार्किक ऑपरेटरों का उपयोग करने के लिए विकल्प जोड़ने की जरूरत है।

तो पाठ बॉक्स में एक उपयोगकर्ता की तरह

Adam OR Adams 
James AND NOT Jame 
Douglas AND (Adam OR Adams) 

मेज पर पूर्ण-पाठ अनुक्रमण जोड़ना बातों के लिए खोज कर सकते हैं एक पसंदीदा विकल्प के बाद से मैं डेटा मॉडल को नियंत्रित नहीं करते नहीं है।

मैं टेक्स्ट प्रश्नों की व्याख्या करने और एसक्यूएलएआरएम्स की उचित संख्या के साथ एक SQL कथन में परिवर्तित करने की एक विधि की तलाश में हूं।

searchexpression = "Douglas AND (Adam OR Adams)" 
MakeSearchQuery(searchexpression, out sqlquery, out SqlParam[] params) 

तरह

sqlquery = "SELECT someFields FROM table WHERE [email protected] AND ([email protected] OR [email protected])" 

और अब किसी को उस से पहले कुछ इस तरह बना दिया है होना चाहिए की तरह

sqlParam[0] = 'Douglas' 
sqlParam[1] = 'Adam' 
sqlParam[2] = 'Adams' 

एक sqlParams somelike लौट सकते हैं? मैंने बिना किसी वास्तविक सफलता के एसओ और Google दोनों खोजे हैं। और ओपन सोर्स/फ्री कोड या एसक्यूएल में सर्च एक्सप्रेशन को कन्वर्ट करने के बारे में एक अच्छा विचार है।

+0

आप किस SQL ​​इंजन के साथ काम करते हैं, उत्तर प्रति डेटाबेस अलग है। कुछ समर्थन regexp, कुछ नहीं करते हैं। – Johan

+0

एसक्यूएल सर्वर 2008 आर 2 – Paaland

उत्तर

2

किसी प्रकार के पार्सर के माध्यम से क्वेरी के विश्लेषण और/या/(आदि) को पार करने की आवश्यकता है। इस सरल के लिए, shunting-yard algorithm अच्छी तरह से करना चाहिए (और टैग्स पर एसई फ़िल्टर करते समय हम और/या/आदि को कैसे संभालते हैं, हालांकि पूर्ण ब्रैकेट किए गए उप-अभिव्यक्तियों के लिए समर्थन केवल आंतरिक रूप से उपलब्ध है)। इस आपरेशन के एक पेड़ है, यानी उत्पन्न होगा (यहाँ उपसर्ग प्रतिनिधित्व का उपयोग कर, लेकिन इसे और अधिक आम तौर पर एक एएसटी उत्पादन किया जाता है)

and("Douglas", or("adam", "adams")) 

है जिसे आप TSQL उत्पन्न करने के लिए उपयोग करने के लिए की जरूरत है। मामूली नहीं, लेकिन रॉकेट-विज्ञान भी नहीं।

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