网上有不少人提出过类似的问题:“看到有人写了WHERE 1=1这样的SQL,到底是什么意思?”。其实使用这种用法的开发人员一般都是在使用动态组装的SQL。让我们想像如下的场景:用户要求提供一个灵活的查询界面来根据各种复杂的条件来查询员工信息,界面如下图:

界面中列出了四个查询条件,包括按工号查询、按姓名查询、按年龄查询以及按工资查询,每个查询条件前都有一个复选框,如果复选框被选中,则表示将其做为一个过滤条件。比如上图就表示“检索工号介于DEV001和DEV008之间、姓名中含有J并且工资介于3000元到6000元的员工信息”。如果不选中姓名前的复选框,比如下图表示“检索工号介于DEV001和DEV008之间并且工资介于3000元到6000元的员工信息”:

如果将所有的复选框都不选中,则表示表示“检索所有员工信息”,比如下图:

这里的数据检索与前面的数据检索都不一样,因为前边例子中的数据检索的过滤条件都是确定的,而这里的过滤条件则随着用户设置的不同而有变化,这时就要根据用户的设置来动态组装SQL了。当不选中年龄前的复选框的时候要使用下面的SQL语句:

SELECT*FROMT_EmployeeWHEREFNumberBETWEEN'DEV001'AND'DEV008'ANDFNameLIKE'%J%'ANDFSalaryBETWEEN3000AND6000

而如果不选中姓名和年龄前的复选框的时候就要使用下面的SQL语句:

SELECT*FROMT_EmployeeWHEREFNumberBETWEEN'DEV001'AND'DEV008'ANDFSalaryBETWEEN3000AND6000

而如果将所有的复选框都不选中的时候就要使用下面的SQL语句:

SELECT*FROMT_Employee

要实现这种动态的SQL语句拼装,我们可以在宿主语言中建立一个字符串,然后逐个判断各个复选框是否选中来向这个字符串中添加SQL语句片段。这里有一个问题就是当有复选框被选中的时候SQL语句是含有WHERE子句的,

而当所有的复选框都没有被选中的时候就没有WHERE子句了,因此在添加每一个过滤条件判断的时候都要判断是否已经存在WHERE语句了,如果没有WHERE语句则添加WHERE语句。 在判断每一个复选框的时候都要去判断, 这使得用起来非常麻烦,“聪明的程序员是会偷懒的程序员”,因此开发人员想到了一个捷径:为SQL语句指定一个永远为真的条件语句(比如“1=1”),这样就不用考虑WHERE语句是否存在的问题了。伪代码如下:

String sql="SELECT * FROM T_Employee WHERE 1=1";if(工号复选框选中) { sql.appendLine("AND FNumber BETWEEN '"工号文本框1内容"' AND '"工号文本框2内容"'"); }if(姓名复选框选中) { sql.appendLine("AND FName LIKE '%"姓名文本框内容"%'"); }if(年龄复选框选中) { sql.appendLine("AND FAge BETWEEN"年龄文本框1内容"AND"年龄文本框2内容); } executeSQL(sql);

这样如果不选中姓名和年龄前的复选框的时候就会执行下面的SQL语句:

SELECT*FROM T_Employee WHERE1=1AND FNumber BETWEEN'DEV001'AND'DEV008'AND FSalary BETWEEN3000AND6000

而如果将所有的复选框都不选中的时候就会执行下面的SQL语句:

SELECT*FROM T_Employee WHERE1=1

这看似非常优美的解决了问题,殊不知这样很可能会造成非常大的性能损失,因为使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。因此如果数据检索对性能有比较高的要求就不要使用这种“简便”的方式。下面给出一种参考实现,伪代码如下:

privatevoiddoQuery() { Bool hasWhere=false; StringBuilder sql=newStringBuilder("SELECT * FROM T_Employee");if(工号复选框选中) { hasWhere=appendWhereIfNeed(sql, hasWhere);sql.appendLine("FNumber BETWEEN '"工号文本框1内容"' AND '"工号文本框2内容"'"); }if(姓名复选框选中) { hasWhere=appendWhereIfNeed(sql, hasWhere); sql.appendLine("FName LIKE '%"姓名文本框内容"%'"); }if(年龄复选框选中) { hasWhere=appendWhereIfNeed(sql, hasWhere); sql.appendLine("FAge BETWEEN"年龄文本框1内容"AND"年龄文本框2内容); } executeSQL(sql); }privateBool appendWhereIfNeed(StringBuilder sql,Bool hasWhere) {if(hasWhere==false) { sql. appendLine("WHERE"); }else{ sql. appendLine("AND"); } }

以上内容由博主摘自《程序员的SQL金典》。

模糊查询时:

String name = request.getParameter("name");  //姓名

String rank= request.getParameter("age");  //年龄

String address= request.getParameter("address");  //地址

String sql = "select * from  student where 1=1 ";

if(name!=null && !name.equals("")){

sql  = "t.name like '%" name "%'";

}

if(rank!=null && !rank.equals("")){

sql  = "t.age like '%" age "%'";

}

if(address!=null && !address.equals("")){

sql  = "t.address like '%" address "%'";

}

java多条件sql查询_SQL 多条件查询相关推荐

  1. sql 相加_SQL多表查询

    一.表的加法 相加就是用union把两个select语句相加,会去重:如果需要保留重复的行,用union all就可以了 二.表的联结 联结的几种类型: 1.交叉联结 2.内联结 3.左联结 4.右联 ...

  2. sql镶嵌查询_SQL语句 - 嵌套查询

    嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. ...

  3. java代码转置sql数据_SQL Server中的数据科学:数据分析和转换–使用SQL透视和转置

    java代码转置sql数据 In data science, understanding and preparing data is critical, such as the use of the ...

  4. select下拉框带模糊查询_SQL 之 简单查询

    学习目标 1.基本的查询语句 2.指定查询条件 3.注释和SQL语句注意事项 4.运算符 5.字符串模糊查询 一. 基本的查询语句 我们通过向数据库发送SQL查询语句,数据库里运行SQL语句,将查询结 ...

  5. sqlserver垮库查询_sql跨库查询(sqlserver跨库查询)

    sql跨库查询(sqlserver跨库查询) 2020-07-24 11:56:42 共10个回答 首先你的要求不明确..要是按照你的要求的话以下语句就可以解决了跨库中只要用.来表示就可以了db.ta ...

  6. mysql对结果再查询_SQL如何在查询结果里再次查询?

    展开全部 可以使用括号"(select查询子句)"套嵌一个查询结果. 语法格32313133353236313431303231363533e59b9ee7ad9431333339 ...

  7. sql针对某字段去重查询_sql的简单查询

    在sql的增删改查中.查询用的最多.所以对查询做多一点的记录 最基本格式: select 字段名1,字段名2,... from 表名 如果查询的想显示所有的字段 select * from 表名 查询 ...

  8. oracle中文字段名怎么查询_sql注入联合查询总结

    点击上方蓝色字关注我们 联合查询注入利用的前提: 前提条件:页面上有显示位 联合注入的过程: 1.判断注入点 2.判断是整型还是字符型 3.判断查询列数 4.判断显示位 5.获取所有数据库名 6.获取 ...

  9. mysql根据字段长度查询_SQL语句如何查询某一字符串字段长度等于某个值的所有记录...

    展开全部 可以32313133353236313431303231363533e59b9ee7ad9431333366303066使用length()函数.比如:select * from test  ...

最新文章

  1. 到成都去是联想的必然选择
  2. 关于智能车竞赛总结 | 山东大学(威海) - 山魂五队
  3. python3练习,python3练习题 - 来自菜鸟的独白
  4. 九、【栈和队列】栈和递归
  5. mysql中php编程实例_PHP连接MYSQL数据库实例代码
  6. atop用法_atop 使用详情
  7. ADO获取表的所有字段名
  8. python excel对比_Python处理Excel模块的对比分析
  9. 传染病模型(4)——SIRS模型和SIER模型及matlab具体程序
  10. File和IO流应用,剪切文件夹
  11. 腾讯云服务器购买详细教程
  12. ec12编码器电路图_光电编码器的电路原理图详解
  13. 用python画微笑脸表情_“裂开了,苦涩了,翻白眼”!我用Python画出微信新出的表情包...
  14. python怎么从excel获取数据_python如何读取excel表数据
  15. 织梦教程:显示昨日今日时间不同效果
  16. python怎么在gui中显示图片_用 PySimpleGUI 做程序(7)--显示图片
  17. `英语` 2022/8/29
  18. C语言笔记(1.3版本,目前3.5w字)----未完待续
  19. 持续集成(四)Jenkins配置报警机制
  20. RK3566调整LCD的背光PWM通道

热门文章

  1. 忙活了一年的开源社区,终于赶上了春节前的末班车!
  2. iqooneo系统升级好不好_IQOONeo系统测评 全新FuntouchOS9十分好用
  3. ubuntu系统 分辨率只有640*480 的解决办法
  4. 阿里云slb配置https重定向后变为http
  5. 挖洞经验--绕过cdn寻找真实ip
  6. unity学习之URP多相机以及多通道渲染
  7. 浅谈word、chm、PDF与BizHelp的区别
  8. 春水的旁边是一块块石板砌成的小道
  9. Linux umask 函数
  10. 服务器加固态系统迁移,服务器无缝升级SSD固态硬盘解决方案