zoukankan      html  css  js  c++  java
  • where 1=1(转载)

      我们先来看看这个语句的结果:select * from table where 1=1,其中where 1=1,由于1=1永远是成立的,返回TRUE,条件为真;所以,这条语句,就相当于select * from table,返回查询表中的所有数据。

      一、不用where  1=1  在多条件查询中的困扰

      举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下:

      string MySqlStr=”select * from table where”;

      if(Age.Text.Lenght>0)
      {
        MySqlStr=MySqlStr+“Age=“+“'Age.Text'“;
      }

      if(Address.Text.Lenght>0)
      {
        MySqlStr=MySqlStr+“and Address=“+“'Address.Text'“;
      }

      ①种假设

      如果上述的两个IF判断语句,均为True,即用户都输入了查询词,那么,最终的MySqlStr动态构造语句变为:

      MySqlStr=”select * from table where Age='18'  and Address='云南省文山州广南县小波吗村'”

      可以看得出来,这是一条完整的正确的SQL查询语句,能够正确的被执行,并根据数据库是否存在记录,返回数据。

      ②种假设

      如果上述的两个IF判断语句不成立,那么,最终的MySqlStr动态构造语句变为:

      MySqlStr=”select * from table where“

      现在,我们来看一下这条语句,由于where关键词后面需要使用条件,但是这条语句根本就不存在条件,所以,该语句就是一条错误的语句,肯定不能被执行,不仅报错,同时还不会查询到任何数据。

      上述的两种假设,代表了现实的应用,说明,语句的构造存在问题,不足以应付灵活多变的查询条件。

      二、使用 where  1=1  的好处

      假如我们将上述的语句改为:

      string MySqlStr=”select * from table where  1=1 ”;

      if(Age.Text.Lenght>0)
      {
        MySqlStr=MySqlStr+“and Age=“+“'Age.Text'“;
      }

      if(Address.Text.Lenght>0)
      {
        MySqlStr=MySqlStr+“and Address=“+“'Address.Text'“;
      }

      现在,也存在两种假设

      ①种假设

      如果两个IF都成立,那么,语句变为:

      MySqlStr=”select * from table where  1=1 and Age='18'  and Address='云南省文山州广南县小波吗村'”,很明显,该语句是一条正确的语句,能够正确执行,如果数据库有记录,肯定会被查询到。

      ②种假设

      如果两个IF都不成立,那么,语句变为:

      MySqlStr=”select * from table where 1=1”,现在,我们来看这条语句,由于where 1=1 是为True的语句,因此,该条语句语法正确,能够被正确执行,它的作用相当于:MySqlStr=”select * from table”,即返回表中所有数据。

      言下之意就是:如果用户在多条件查询页面中,不选择任何字段、不输入任何关键词,那么,必将返回表中所有数据;如果用户在页面中,选择了部分字段并且输入了部分查询关键词,那么,就按用户设置的条件进行查询。

      说到这里,不知道您是否已明白,其实,where 1=1的应用,不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法。

      三、我必须使用  where 1=1  才能做多条件查询吗

      非也,您爱使用就使用,您不喜欢使用就不使用,对于您而言,不损失什么,也不会多得什么;

      那么,如果我不使用where 1=1做多条件查询,该如何构造动态查询语句呢?非常简单,在下给您提供一种思维:

      如下语句:

      string MySqlStr=”select * from table”;
      

      if(Age.Text.Lenght>0)
      {
        QuerySqlStr=QuerySqlStr+“Age=“+“'Age.Text'“;
      }

      if(Address.Text.Lenght>0)
      {
        QuerySqlStr=QuerySqlStr+“and Address=“+“'Address.Text'“;
      }

      if(QuerySqlStr.Lenght>0)
      {
        MySqlStr=MySqlStr+“ where “+QuerySqlStr;
      }

      不管你使用不使用where 1=1做多条件查询,只要您能够保证您构造出来的查询语句,是正确的就万无一失了。

      四、where 1=1 的总结

      为方便构造动态的多条件之不确定因素的复杂的正确的查询语句所采取的一种“江湖手段”。

      此类方法,一般,在书籍上不常见,而在实际的应用中,人们得从现实角度考虑,即要保证能满足多条件查询、同时还要能应付不确定因素的灵活性,最后还要保证语句不出现任何语法错误。

  • 相关阅读:
    bzoj4165 矩阵 堆维护多路归并
    bzoj2802 [Poi2012]Warehouse Store 贪心+堆
    bzoj1367 [Baltic2004]sequence 左偏树+贪心
    bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树
    uoj207 共价大爷游长沙 子树信息 LCT + 随机化 + 路径覆盖
    bzoj4764 弹飞大爷 LCT
    bzoj4817 & loj2001 [Sdoi2017]树点涂色 LCT + 线段树
    bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
    bzoj4998 星球联盟 LCT + 并查集
    bzoj3091 城市旅行 LCT + 区间合并
  • 原文地址:https://www.cnblogs.com/nyth/p/1864948.html
Copyright © 2011-2022 走看看