2013-02-20 39 views
5

Tôi có một câu hỏi và có thể đơn giản của nó (cho bạn Gurus).Dynamic MySQL Where Clause in Stored Procedure

Tôi đang chuyển lớp SQL Paging của mình từ C# sang thủ tục lưu trữ MySQL. Trong đối tượng C# do nhà tạo của tôi, truy vấn được xây dựng động dựa trên tiêu chí. Ví dụ:

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 

Bây giờ, câu hỏi của tôi là: Làm thế nào để làm một mệnh đề where động trong MySQL tương tự như này? Hay đúng hơn, nếu họ không nhập bất cứ thứ gì cho các tham số đó, làm thế nào tôi có thể nói với MySQL trong thủ tục lưu trữ để bỏ qua những thứ đó? IE:

SELECT col1, col2 FROM tblThreads 

Điều gì đó giống như công việc này, nếu các thông số đó là rỗng?

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

??

Xin cảm ơn các bạn.

Trả lời

1

Cách đơn giản nhất nếu bạn đang cho phép họ truy vấn toàn bộ cơ sở dữ liệu là chỉ cần thêm một 1 = 1 để Something tuyên bố của bạn như

whereClause = "WHERE 1 = 1" 

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

Tôi thích trang này. Tôi sử dụng bản thân mình, khi tôi phải phân tích các câu lệnh SQL "nặng", tức là loại bỏ mệnh đề AND. Cho phép bạn 'quay trở lại trước đó' AND ', và loại bỏ dòng đó, v.v. Giảm giá WHERE khiến việc này trở nên dễ dàng hơn nhiều. –

+0

Tôi đã nhìn thấy điều này một lần trước đây, và mặc dù nó không trả lời câu hỏi ban đầu của tôi nó là thú vị. Giả sử tôi dính vào lớp đối tượng C# của tôi, ngay bây giờ tôi đang cố gắng để xác định nếu tôi đang sử dụng "AND" (tôi có một biến boolean được đặt thành đúng thời điểm tôi sử dụng VÀ.) Giả sử tôi làm điều này, tôi sẽ 't phải theo dõi khi tôi sử dụng tham số đầu tiên của tôi, đúng không? Điều này có bất kỳ hình phạt hiệu suất nào và 1 = 1 có gây ra bất kỳ vấn đề nào không? –

+0

Chỉ cần tra cứu một số chi tiết bổ sung tại đây: http://stackoverflow.com/questions/8149142/where-1-1-statement Tôi thực sự thích ý tưởng này và sẽ thử triển khai nó. Cảm ơn vì tiền hỗ trợ! Tôi cũng có thể xây dựng thủ tục lưu trữ của mình bằng phương pháp này nếu tôi quyết định theo đuổi con đường đó. Cảm ơn các bạn. –

2

Bạn có thể sử dụng CASE tuyên bố để kiểm tra giá trị của @keywords, ví dụ: .

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

Điều gì sẽ xảy ra nếu tất cả các tham số đều rỗng? Điều đó có khiến cho việc thực thi kém không? IE: mô tả LIKE '%%' VÀ giá LIKE '%%' VÀ param3 LIKE '%%' AND ... paramX LIKE '%%'? –

+0

Bỏ qua bình luận cuối cùng của tôi. Nếu tôi làm phương pháp 1 = 1, sau đó chèn một tuyên bố trường hợp sau đó bằng một số 'TRƯỜNG HỢP KHI @ giá <> NULL THEN VÀ giá LIKE '% price%' ' Tôi nên đoán ... Tôi' đã không bao giờ thử nó, vì vậy đây là suy đoán. –

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 
Các vấn đề liên quan