我们不管是做B/S还是C/S系统都没遇到查询,模糊查的随便你输的,而且项非常多。这个在电子商务或者ERP系统最常见。
像这样的查询我们可以用存储过程去做,或者使用Stringbuilder去拼接,都是动态构建SQL语句。以下是个人使用SQL Server存储过程写的模糊查询:
- ---------------------------------------------------------------------------------------
- /*
- *作 者:lin sen
- *功能说明:动态构建SQL语句之模糊查询
- *编写日期:2010年9月27日
- *
- */
- ---------------------------------------------------------------------------------------
- drop procedure proc_selectTeacher
- go
- create procedure proc_selectTeacher
- (
- @D_ID int, --系别编号
- @T_education varchar(20), --学历
- @T_title varchar(20), --职称
- @T_degree varchar(10), --学位
- @T_IDcard varchar(20), --身份证号
- @T_sex char(2), --性别
- @T_teacherName varchar(10) --教师姓名
- )
- as
- begin
- declare @sql varchar(200)
- select @sql='
- select te.*,de.D_Name
- from teacher as te,department as de
- where te.D_ID=de.D_ID and 1=1'
- --系别编号
- if @D_ID is not null and @D_ID<>''
- begin
- select @sql=@sql+' and de.D_ID=' + cast(@D_ID as varchar)
- end
- --学历
- if @T_education is not null and @T_education<>''
- begin
- select @sql=@sql+' and T_education='+ '''' + @T_education + ''''
- end
- --职称
- if @T_title is not null and @T_title<>''
- begin
- select @sql=@sql+' and T_title=@T_title'+ '''' + @T_title + ''''
- end
- --学位
- if @T_degree is not null and @T_degree<>''
- begin
- select @sql=@sql+' and T_degree='+ '''' + @T_degree + ''''
- end
- --身份证号
- if @T_IDcard is not null and @T_IDcard<>''
- begin
- select @sql=@sql+' and T_IDcard='+ '''' + @T_IDcard + ''''
- end
- --性别
- if @T_sex is not null and @T_sex<>''
- begin
- select @sql=@sql+' and T_sex='+ '''' + @T_sex + ''''
- end
- --教师姓名
- if @T_teacherName is not null and @T_teacherName<>''
- begin
- select @sql=@sql+' and T_teacherName like'+ '''' + @T_teacherName +'%'+''''
- end
- print @sql --输出SQL语句
- exec (@sql) --试行构建的SQL语句
- end
- go
SQL调用:
- exec proc_selectTeacher null,null,null,null,null,'男','陈小东'
上面的存储过程在构建SQL语句的时候注意以下几点,以后方便我们自己写。
1、如果你构建的参数是整形的,用+cast(@D_ID as varchar)。字符串的话是+ '''' + @T_education + '''' ;比如参数是2和本科,exec试行语句时是D_ID=2和T_education='本科',字符串多了单引号。
2、如果你想对某个字段进一步模糊就用:列名 like '参数%';就像上面的教师姓名查询
3、@T_education is not null and @T_education<>'' 前提参数不能为空,为空的话就变成 and T_education=null;
4、挺重要的在where条件加and 1=1;当然有多表连接时可以不写,但是最好写上。
5、多表查询时重复列要指明某表.列名,如de.D_ID。
这个过程只是举个例子,其他地方的做法一样,若其他人有不同做法贴出来一起分享下,或者意见和建议。
由于在Oracle中的execute immediate的查询没有结果体,所以本人目前还不知道怎么实现。就用VS的StrinBuilder来实现Oracle的动态构建SQL语句。
- StringBuilder sb = new StringBuilder();
- sb.AppendFormat("select te.*,de.D_Name from teacher as te,department as de where te.D_ID=de.D_ID and 1=1");
- if (!string.IsNullOrEmpty(txtDID.Text))//这个可以用实体传入
- {
- sb.Append(" de.D_ID='");
- sb.Append(txtDID.Text);
- sb.Append("' and");
- }
- if (!string.IsNullOrEmpty(txtName.Text))
- {
- sb.Append(" de.D_Name='");
- sb.Append(txtName.Text);
- sb.Append("' and");
- }
- if (!string.IsNullOrEmpty(txtEducation.Text))
- {
- sb.Append(" de.D_Education='");
- sb.Append(txtEducation.Text);
- sb.Append("' and");
- }
- //.....
- OracleConnection Conn = new OracleConnection("配置文件");
- OracleCommand Cmd = new OracleCommand(sb.ToString(),Conn);
- //.....
- //需要的试行命令
这个有很多地方省略,朋友们可以自己完善或者写出更好的,但是还是那句话道理一样的。