2011-12-01 34 views
9

Tôi có một ứng dụng web asp.net cần một trang tìm kiếm để tìm kiếm dữ liệu trong một bảng cụ thể (SQL). Hôm nay, nó chỉ có truy vấn LIKE đơn giản, sử dụng sql được parametized:Tìm kiếm SQL với các toán tử logic

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 
} 

Bây giờ tôi cần thêm tùy chọn để sử dụng toán tử logic cho tìm kiếm.

Vì vậy, trong hộp văn bản người dùng có thể tìm kiếm những thứ như

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

Thêm chỉ mục toàn văn để bàn không phải là một lựa chọn ưa thích kể từ khi tôi không kiểm soát mô hình dữ liệu.

Tôi đang tìm một phương pháp diễn giải các truy vấn văn bản và chuyển đổi thành câu lệnh SQL với số lượng SqlParams thích hợp.

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

Would return somelike như

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

Và một sqlParams như

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

Bây giờ thì phải có ai đó mà đã thực hiện một cái gì đó như thế này trước đây chưa? Tôi đã tìm kiếm cả SO và Google mà không có bất kỳ thành công thực sự nào. Và các con trỏ tới mã nguồn mở/miễn phí hoặc ý tưởng hay về cách chuyển đổi biểu thức tìm kiếm thành SQL được chào đón.

+0

Bạn làm việc với công cụ SQL nào, câu trả lời khác với mỗi cơ sở dữ liệu. một số hỗ trợ regexp, một số thì không. – Johan

+0

SQL Server 2008 R2 – Paaland

Trả lời

2

Việc phân tích truy vấn thông qua và/hoặc /() vv cần được thực hiện thông qua một số loại trình phân tích cú pháp. Đối với một cái gì đó đơn giản này, một shunting-yard algorithm nên làm độc đáo (và là cách chúng tôi xử lý và/hoặc/không vv khi lọc SE trên thẻ, mặc dù hỗ trợ đầy đủ cho biểu thức phụ được đặt trong chỉ có sẵn trong nội bộ). Điều này sẽ tạo ra một cây hoạt động, tức là (ở đây sử dụng biểu diễn tiền tố, nhưng nó thường được sử dụng để tạo ra một AST)

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

mà bạn cần sử dụng để tạo TSQL. Không tầm thường, nhưng cũng không phải khoa học tên lửa.

Các vấn đề liên quan