2008-11-21 11 views
6

यदि मेरे पास SELECT * from authors where name = @name_param जैसी कोई क्वेरी है, तो क्या पैरामीटर नामों (विशेष रूप से "name_param") को पार्स करने के लिए कोई रेगेक्स है?SQL पैरामीटर को पार्स करने के लिए Regex

धन्यवाद

+0

बिल्कुल सुनिश्चित नहीं है कि आप क्या पूछ रहे हैं। क्या आप स्पष्टीकरण दे सकते हैं, या उदाहरण दे सकते हैं? क्या आप नामों की एक सूची में पास करना चाहते हैं और इसे WHERE में नाम (name_a, name_b, ...) में परिवर्तित करना चाहते हैं? और आपको आरडीबीएमएस निर्दिष्ट करने की आवश्यकता है, रेगेक्स समर्थन उनके बीच अलग है। –

उत्तर

8

यह मुश्किल है, क्योंकि पैरामीटर भी उद्धृत तार के अंदर हो सकता है।

SELECT * FROM authors WHERE name = @name_param 
    AND string = 'don\'t use @name_param'; 

कैसे नियमित अभिव्यक्ति पहले @name_param, लेकिन दूसरी को उपयोग करने के लिए पता होगा?

यह एक समस्या है जिसे हल किया जा सकता है, लेकिन यह एक नियमित अभिव्यक्ति में ऐसा करने के लिए व्यावहारिक नहीं है। मुझे इसे Zend_Db में संभालना था, और मैंने जो किया वह पहले सभी उद्धृत तारों और सीमित पहचानकर्ताओं को बाहर कर दिया गया था, और फिर आप शेष पर नियमित अभिव्यक्तियों का उपयोग कर सकते हैं।

आप यहाँ कोड देख सकते हैं: http://framework.zend.com/code/browse/~raw,r=8064/Zend_Framework/trunk/library/Zend/Db/Statement.php

कार्यों _stripQuoted() और _parseParameters() देखें।

+3

SQL टिप्पणियों में दिखाई देने वाले पैरामीटर नामों का उल्लेख नहीं करना है। Regexes महान हैं, लेकिन नौकरियों को पार्स करने के लिए जरूरी नहीं है। –

+0

हां, एसक्यूएल टिप्पणियों के बारे में अच्छा बिंदु। –

4

को देखते हुए आप कोई उद्धृत स्ट्रिंग या उन में मानकों के साथ टिप्पणी है, आवश्यक regex काफी तुच्छ होगा:

@([_a-zA-Z]+)  /* match group 1 contains the name only */ 

मैं Bill Karwin's recommendation के साथ जाने सतर्क रहना होगा, जानते हुए भी कि भोली दृष्टिकोण अपने नुकसान है। लेकिन यदि आप जिस डेटा से निपटते हैं, उस परवाह करें, तो यह रेगेक्स आपको चाहिए।

+0

छोटी टिप्पणी: संख्या पैरामीटर नामों में भी मान्य हैं, इसलिए regex @ ([_ a-zA-Z0-9] +) – Samuel

+3

@gissolved यह सच है, लेकिन मुझे लगता है कि पैरामीटर अंकों के साथ शुरू नहीं हो सकता है, और शायद यहां तक ​​कि अंडरस्कोर के साथ। तो मैं '@ ([ए-जेए-जेड] [ए-जेए-जेड -9 _9] *) का उपयोग करूंगा। – bluish

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