2011-12-01 2 views
9

특정 테이블 (SQL)의 데이터를 검색하는 검색 페이지가 필요한 asp.net 웹 응용 프로그램이 있습니다. 오늘은 parametized SQL을 useing, 간단한 LIKE 쿼리가 있습니다 논리 연산자로 SQL 검색

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 
} 

는 지금은 검색에 논리 연산자를 사용하는 옵션을 추가해야합니다.

그래서 텍스트 상자에 사용자가 테이블에 전체 텍스트 인덱싱을 추가

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

같은 일을 검색 할 수있는 것은 내가 데이터 모델을 제어하지 않기 때문에 선호하는 옵션이 아닙니다.

텍스트 쿼리를 해석하고 적절한 수의 SqlParams가있는 SQL 문으로 변환하는 방법을 찾고 있습니다.

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

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

그리고 이제 이전과 같은 일을 한 사람이 있어야

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

같은 sqlParams 같은 somelike을 반환? 나는 진짜 성공없이 SO와 Google을 모두 검색했습니다. 오픈 소스/무료 코드 또는 검색 표현식을 SQL로 변환하는 방법에 대한 좋은 아이디어에 대한 안내문을 환영합니다.

+0

어떤 SQL 엔진을 사용합니까? 데이터베이스마다 답변이 다릅니다. 일부는 정규 표현식을 지원하지만 일부는 지원하지 않습니다. – Johan

+0

SQL Server 2008 R2 – Paaland

답변

2

및/또는 /() 등을 통한 쿼리 구문 분석은 일종의 파서를 통해 수행되어야합니다. 이 간단한 것을 위해 shunting-yard algorithm은 멋지게 수행되어야합니다. (예 : 대괄호로 묶인 하위 표현식에 대한 지원은 내부적으로 만 가능하지만 태그에 SE를 필터링 할 때/또는/등을 처리하는 방법입니다). 이것은 당신이 다음 TSQL을 생성하는 데 사용할 필요가

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

즉 작업의 나무, 생성 할 것이다 (여기서 접두사 표현을 사용하여,하지만 더 일반적으로 AST를 생산하는 데 사용됩니다). 하찮은 것은 아니지만 로켓 과학이 아닙니다.