2013-02-20 28 views
5

Bir sorum var ve belki de basit (sizin için Gurus için).Dinamik MySQL Saklı Prosedürde Madde

SQL Paging sınıfımı C# dan MySQL Stored Procedure'a aktarıyorum. C# ev yapımı nesnemde, sorgu bir ölçüt temelinde dinamik olarak oluşturulur. Örnek:

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 

Şimdi sorum edilir: Nasıl buna benzer MySQL dinamik nerede maddesini yaparsınız? Ya da, bu parametreler için herhangi bir şey girmezlerse, MySQL'in Depolanmış Prosedürde bunları atlamasını nasıl söylerdim? IE: bu parametreler boş olsaydı bu işi gibi

SELECT col1, col2 FROM tblThreads 

misiniz şey?

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

??

Teşekkürler çocuklar.

cevap

1

bunları tüm veritabanını sorgulamak için izin eğer kolay yolu sadece sen @keywords değeri, örneğin kontrol etmek için CASE deyimi kullanabilirsiniz

whereClause = "WHERE 1 = 1" 

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

ben bunu sevdim. Bunu, SQL deyimlerinin "ağır" ayrıştırmasını yapmak zorunda olduğumda, yani AND cümlelerini programlı olarak kaldırdığımda kullanıyorum. "Önceki" ve "geri gitmenizi ve bu satırı kaldırmanızı vb. Sağlar. WHERE yan tümcesinin indirgenmesi bu kadar kolaylaştırır. –

+0

Bunu bir kez daha önce gördüm ve orijinal soruma cevap vermese de ilginç. C# nesnesine yapıştığımı varsayalım, şimdi "VE" kullanıp kullanmadığımı belirlemeye çalışıyorum (VE kullandığım an doğru olarak ayarlanmış bir boole değişkeni var.) Bunu yaptığımı varsayarak İlk parametreyi kullandığımda, takip etmem gerekiyor mu? Bu herhangi bir performans cezaları var mı ve 1 = 1 neden herhangi bir sorun var mı? –

+0

Sadece bazı ek detaylara bakınız: http://stackoverflow.com/questions/8149142/where-1-1-tatement Aslında bu fikri beğendim ve uygulamayı deneyeceğim. Bahşiş için teşekkürler! Aynı zamanda bu yöntemi kullanarak depolanmış prosedürümü de kurabilirim, eğer bu caddeyi takip etmeye karar verirsem. Teşekkürler beyler. –

2

gibi deyim Something bir 1 = 1 eklemektir .

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

Tüm parametreler boşsa ne olur? Bu kötü idam için yapmaz mı? IE: açıklama '%%' GİBİ ve '%%' LIKE ve '%%' LIKE '%' paramix '%%' DAHA FAZLASI? –

+0

Son yorumumu görmezden gel. Eğer 1 = 1 metodunu kullanırsam, o zaman 'CASE WHEN @price <> NULL SONRA VE fiyat LIKE '% price%' Çalışmalıyım. ve asla denemedim, bu yüzden bu spekülasyon. –

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