处理多项查询的sql怎么处理?(不知道怎么表达,参见详情如下)

一只独孤的程序猿 2011-11-22 10:25:55
就是我在做信息查找的时候会有好多表单,如下:

这样可以让他有选择,可能还有好多项,但是无论他添什么信息进行查找都能实现查找;
但是问题就来了:
我怎么在sql里面进行处理呢,如果按照一般的思维来想得话:我用select * from note where 什么什么?我在这里
必须要定死得,或者说必须能接受到参数,如果接受到的参数为空的话,那么sql一定会报错的,在这里我要怎么处理呢?
麻烦高手给一个具体的结果方式,或者给一个精确的算法,谢谢了。
...全文
365 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
什么都不能 2011-11-26
  • 打赏
  • 举报
回复
<select id="queryStudentsInfo" parameterClass="hashmap" resultMap="studentMap">
<![CDATA[
select student_id, student_name,... from note
]]>
<dynamic prepend="where">
<isNotNull property="fullName" prepend="and">
student_name = '%' || #fullname# || '%'
</isNotNull>
<isNotNull property="schoolName" prepend="and">
school_name = '%' || #schoolName# || '%'
</isNotNull>
<isNotNull property="departmentName" prepend="and">
department_name = #departmentName#
</isNotNull>
<isNotNull property="registDate" prepend="and">
regist_date = to_date(#registDate#, 'yyyy-mm-dd')
</isNotNull>
</dynamic>

</select>
wolf863292 2011-11-23
  • 打赏
  • 举报
回复
仅就这个问题来说,where 1=1,直接拼字符串就行了。
也可以
String sql = "";
sql += xx;
。。。

if(sql.length > 0) sql = " where " + sql;
dingherry 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wclxyn 的回复:]
String sql="select * from note where 1=1";
标红的地方为真的话,那么说明他不对数据查询造成任何影响,无论他数据库里面有没有这个字段是吗?
[/Quote]
1=1 是true
就是说where后面有真条件。是有条件查询。
这个主要是从语法安全性上为了where考虑的。
试想你没有1=1,而且后面没有参数,那单独的select * from note where 是执行不了查询的。
绝世酱油瓶 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaoqiuwyh 的回复:]

StringBuffer拼sql语句,加判断就行了。
[/Quote] +1
用StringBuffer实现、根据你传到后台的参数判断、
如果参数不为空就append。。。
Aquarius_T 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 wclxyn 的回复:]
引用 29 楼 litiebiao2012 的回复:
引用 10 楼 aquarius_t 的回复:

给你看我的。,

Java code

public List<Employee> specificInquiresr(String ename, String gender,
String age, String salary, String deptno) throws SQ……
[/Quote]

晕死,,,,这是sql语句拼接啊,字段少得话最适合这样了,字段多的话适合用框架....


StringBuffer sql = new StringBuffer();
sql.append("select * from employee_w where 1=1");
//select * from employee_w where 1=1 是一定执行的
//String ename1 = ename.trim();
//如果名字不等于空,就在select * from employee_w where 加上and ename like '%" + ename +"%'
if(ename.trim()!=""){
sql.append(" and ename like '%" + ename +"%'");
}
//如果性别为男(我这里的1是select里男的value值)就在select * from employee_w where and ename like '%" + ename +"%'后面再加上and gender='男'

if(gender.equals("0")){
sql.append("");
}else if(gender.equals("1")){
sql.append(" and gender='男'");
}else if(gender.equals("2")){
sql.append(" and gender='女'");
}
//。。。。。。依次类推
if(age!=""){
sql.append(" and age= " + age);
}

if(salary.equals("0")){
sql.append(" " );
}else if(salary.equals("1")){
sql.append(" and salary<3000" );
}else if(salary.equals("2")){
sql.append(" and salary between 3000 and 5000" );
}else if(salary.equals("3")){
sql.append(" and salary between 5000 and 7000" );
}else if(salary.equals("4")){
sql.append(" and salary between 7000 and 9000" );
}else if(salary.equals("5")){
sql.append(" and salary>9000" );
}

if(deptno.equals("0")){
sql.append(" ");
}else if(deptno.equals("1")){
sql.append(" and deptno='1001'");
}else if(deptno.equals("2")){
sql.append(" and deptno='1002'");
}else if(deptno.equals("3")){
sql.append(" and deptno='1003'");
}else if(deptno.equals("4")){
sql.append(" and deptno='1004'");
}
//这里是类型转换
String sql1 = sql.toString();
PreparedStatement ps = conn.prepareStatement(sql1);
//这里是传到数据库的sql语句,你打印出来可以看一下就明白了....
System.out.println(sql1);

艳沐石 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 litiebiao2012 的回复:]

引用 10 楼 aquarius_t 的回复:
动态sql编写,最忌讳硬编码了,我界面要是有50个input标签,难道你要在代码里面写50个if 拼串吗?
可以使用xml维护sql
然后velocity+dom4j动态解析
这样后此维护灰常方便
[/Quote]

如果不喜欢操作文件,你也可以把你要查询的东西,放到map里,让key为对应表中的字段值,然后value是你限制条件,也可以拼接。
或者你封装一个对象,里面对应着字段名、条件值和连接条件(or,like,and等)。
艳沐石 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 creso 的回复:]

不推荐这样,容易被SQL注入,用命名成熟或者占位的SQL吧
[/Quote]

这就是一个方便查找的东西吧,信息都是开放的呢~~

不是登录什么安全级别的验证,需要考虑注入么?
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 litiebiao2012 的回复:]
引用 10 楼 aquarius_t 的回复:

给你看我的。,

Java code

public List<Employee> specificInquiresr(String ename, String gender,
String age, String salary, String deptno) throws SQLException {
Connection con……
[/Quote]
我也很想知道,这个是怎么实现的?
半个鼠标 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 apeipo 的回复:]

有没有更好地方法.比如用ORM什么的.

这种拼接要是查询项多的话.那代码就...
[/Quote]

肯定可以做,只是你看楼主的意思就是sql拼接了,其实ORM更简单
NewSpaceOnMyWay 2011-11-22
  • 打赏
  • 举报
回复
持久层用的是神马!
Apeipo 2011-11-22
  • 打赏
  • 举报
回复
有没有更好地方法.比如用ORM什么的.

这种拼接要是查询项多的话.那代码就...
半个鼠标 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 aquarius_t 的回复:]

引用 19 楼 oyxm0 的回复:
引用 16 楼 gavin_ts 的回复:

把你所要的查询条件放到Map里边
比如在action中
Java code

Map<String,String> map = new HashMap<String,String>
map.put("name",request.getParamter("name"));



map.put("add……
[/Quote]

大姐,我说接收外面的不需要集合,我没说返回不需要集合!
幸运 2011-11-22
  • 打赏
  • 举报
回复
ALTER procedure p_Article
(@i_Treeid Int,
@startIndex int,
@endIndex int,
@vc_author varchar(50),
@vc_title varchar(50),
@docount bit)
as
--定义一个表格变量,字段为GridView所需字段
declare @table table(i_ID int,vc_Title varchar(50),vc_Author varchar(50),i_TreeID int,dt_AddTime datetime,txt_Content text,vc_TreeName varchar(50))
begin
--查询vw_User中数据填充到表格变量中
insert @table(i_ID,vc_Title,vc_Author,i_TreeID,dt_AddTime,txt_Content,vc_TreeName) select i_ID,vc_Title,vc_Author,i_TreeID,dt_AddTime,txt_Content,vc_TreeName FROM vc_Article where i_treeid=@i_treeid
--根据条件删除不符合条件的记录
if @vc_Title!=''
begin
delete @table where vc_Title not like '%'+@vc_Title+'%'
end
if @vc_author!=''
begin
delete @table where vc_author not like '%'+@vc_author+'%'
end
if(@docount=1)
select count(*) from @table
else
begin
with temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY dt_AddTime desc)AS Row, * from @table )
SELECT * FROM temptbl where Row between @startIndex and @endIndex
end
end
hongfeideng 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunnylyy 的回复:]

最简单的办法,拼串
Java code

String sql="select * from note where 1=1";
if(name != null){
sql+=" and name='"+name+"'";
}
if(school != null){
sql+=" and school='"+school+"'";
}
[/Quote]

+1
daisy_8706 2011-11-22
  • 打赏
  • 举报
回复
where 1=1
Aquarius_T 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 oyxm0 的回复:]
引用 16 楼 gavin_ts 的回复:

把你所要的查询条件放到Map里边
比如在action中
Java code

Map<String,String> map = new HashMap<String,String>
map.put("name",request.getParamter("name"));
map.put("address",request.getPara……
[/Quote]

你不要集合,你怎么接受从数据库查询到的数据呢?
半个鼠标 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gavin_ts 的回复:]

把你所要的查询条件放到Map里边
比如在action中
Java code

Map<String,String> map = new HashMap<String,String>
map.put("name",request.getParamter("name"));
map.put("address",request.getParamter("address"));


然后把ma……
[/Quote]

为了简单,可以把集合也不要了
StringBuffer sql=new StringBuffer("select * from where 2=2");
if(name!=null&&"".equals(name)){
sql.apend(" and name like '"+name+"' ");
}
...这是支持模糊查询的
如果是查询
if(name!=null&&"".equals(name)){
sql.apend(" and name='"+name+" ");
}

...
Aquarius_T 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gavin_ts 的回复:]
把你所要的查询条件放到Map里边
比如在action中

Java code


Map<String,String> map = new HashMap<String,String>
map.put("name",request.getParamter("name"));
map.put("address",request.getParamter("address"));

……
[/Quote]

我觉得这样很麻烦的,直接在servlet里拿到jsp页面所有的数据就可以了,不用再一个一个拿》。。。
Aquarius_T 2011-11-22
  • 打赏
  • 举报
回复
给分吧.....
我嘞个去 2011-11-22
  • 打赏
  • 举报
回复
把你所要的查询条件放到Map里边
比如在action中

Map<String,String> map = new HashMap<String,String>
map.put("name",request.getParamter("name"));
map.put("address",request.getParamter("address"));

然后把map传到dao层
在sql查询的时候拼句啊

StrinBuffer sb = "select * from note where 1=1"
if(map.get("name")!=null){
sb.append(" and name='"+map.get(name)+"'");
}
if(map.get("address")!=null){
sb.append(" and address ='"+map.get("address")+"'");
}


最后 执行拼出来的这个sql语句就OK!
加载更多回复(21)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧