2008-11-21 26 views
6

SELECT * from authors where name = @name_param gibi bir soruyum varsa, parametre adlarını (özellikle "name_param") ayrıştırmak için bir düzenli ifade var mı?SQL parametrelerini ayrıştırma için düzenli ifade

Teşekkür

+0

Tam olarak ne sorduğundan emin değilsiniz. Açıklığa kavuşabilir mi, örnek verebilir misiniz? Bir isimler listesinden geçmek ve WHERE ismini (name_a, name_b, ...) olarak çevirmek mi istiyorsunuz? ve RDBMS'yi belirtmeniz gerekiyor, Regex desteği bunların arasında farklı. –

cevap

8

parametreler de tırnaklı dizge içinde oluşabilir, çünkü bu zordur.

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

Nasıl düzenli ifade ilk @name_param ancak ikinci kullanmayı bilecek?

Bu, çözülebilecek bir sorundur, ancak tek bir normal ifadede bunu yapmak pratik değildir. Bunu Zend_Db'de işlemek zorunda kaldım ve yaptığım şey önce tüm alıntılanmış dizeleri ve sınırlanmış tanımlayıcıları çıkardı ve sonra geri kalanında normal ifadeler kullanabilirsiniz.

Burada kodunu görebilirsiniz: http://framework.zend.com/code/browse/~raw,r=8064/Zend_Framework/trunk/library/Zend/Db/Statement.php

bakın fonksiyonlarını _stripQuoted() ve _parseParameters().

+3

SQL yorumlarında görünen parametre adlarından bahsetmiyoruz. Normal ifadeler harikadır, ancak ayrıştırma işleri için mutlaka büyük değildir. –

+0

Evet, SQL yorumları hakkında iyi bir nokta. –

4

sen onları özelliklere uygun tırnakla veya yorumlarınız göz önüne alındığında, gerekli regex oldukça önemsiz olacaktır:

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

Ben naif bir yaklaşım onun tuzaklar var olduğunu bilerek, tedbirli olmak Bill Karwin's recommendation ile gitmek. Ama uğraştığın verileri kesiyorsan, bu regex ihtiyacınız olan her şey olurdu.

+0

Small remark: Sayılar parametre isimlerinde de geçerlidir, dolayısıyla regex @ ([_ a-zA-Z0-9] +) – Samuel

+3

@ doğru olmalıdır, ancak parametrenin rakamlarla başlayamadığını düşünüyorum. bir alt çizgi ile. Yani ben kullanıyorum @ ([a-zA-Z] [a-zA-Z0-9 _] *) '. – bluish