SQL 多条件查询 where 1=1

原创 2018年04月17日 11:57:40

要实现这种动态的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 WHERE 1=1 
AND FNumber BETWEEN 'DEV001' AND 'DEV008' 
AND FSalary BETWEEN 3000 AND 6000
而如果将所有的复选框都不选中的时候就会执行下面的SQL语句:
SELECT * FROM T_Employee WHERE 1=1



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


StringBuilder buff = new StringBuilder("select * from T ")
String sp = " WHERE ";
foreach() {
if (...) {
buff.append(sp).append(cond);
sp = " AND ";
}
}


但是where 1=1真的低效么?答案是不影响。

   因为查询分析器在代数树优化阶段就把1=1 直接给过滤掉了。这个功能就是查询优化器中所谓的“Constant Folding”。

深入了解参见:https://www.cnblogs.com/CareySon/p/4138575.htm



SQL之解决where 1=1 问题及优化多条件查询

Dao中实现多条件查询。public List query(String name ,BigDecimal minSalePrice, BigDecimal maxSalePrice)...
  • Phone_1070333541
  • Phone_1070333541
  • 2017-12-17 21:44:23
  • 393

sql查询条件where 1=1,1=2

数据库在进行查询的时候,经常看到有的人使用where 1=1和1=2等的查询 。 这种查询在执行前就会被计算出true(1=1)和或false(1=2). 主要是为了动态拼凑sql语句时,方便程序...
  • CHS007chs
  • CHS007chs
  • 2016-07-12 16:52:48
  • 697

sql查询语句中$where="1=1"的含义

在公司做项目发现,sql语句中有类似这样的sql语句。
  • LuoSiSan
  • LuoSiSan
  • 2014-09-28 15:09:19
  • 1636

关于数据库查询语句中的where 1=1条件的应用解析

where 1=1有什么用?在SQL语言中,写这么一句话就跟没写一样。 select * from table1 where 1=1与select * from table1完全没有区别,其目的就只...
  • SONGCHUNHONG
  • SONGCHUNHONG
  • 2016-04-06 11:19:52
  • 1330

sql 1=1和1=0的作用

  • 2011年08月10日 11:55
  • 3KB
  • 下载

sql where 1=1 规范代码

在讲解这个问题的时候,首先来看一个例子。看一下这两个句子:select * from user select * from user where 1=1这两个 句子执行结果是一样一样的。而sql注入...
  • zc474235918
  • zc474235918
  • 2016-01-19 19:30:31
  • 2898

SQL语句 where 1=1 && where 1<>1

http://blog.csdn.net/fanyuna/article/details/5972437 where 1=1 最近看到很多sql里用到where 1=1,原来觉得这没用嘛,但是又想...
  • jqq_apple
  • jqq_apple
  • 2015-09-16 14:51:01
  • 591

SQL中使用where 1=1 和 select * 的坏处

先看一个例子:           SELECT  *  FROM PERSON   WHERE    1=1                          AGE > #a...
  • wlinshan
  • wlinshan
  • 2016-05-09 18:29:08
  • 2935

SQL 语句中 where 条件后 写上1=1  是什么意思

这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的。例如:   String sql="select * from table_name  ...
  • fu_manxing
  • fu_manxing
  • 2016-08-26 16:16:26
  • 7785

sql中where 1=1和 0=1 的作用

转载自:http://www.cnblogs.com/junyuz/archive/2011/03/10/1979646.html        where 1=1; 这个条件始终为True,在...
  • zero__007
  • zero__007
  • 2016-07-09 07:55:34
  • 1910
收藏助手
不良信息举报
您举报文章:SQL 多条件查询 where 1=1
举报原因:
原因补充:

(最多只允许输入30个字)