1=1 永真

这个语句的作用是:动态SQL拼接时,为了避免拼接条件不满足而导致语义不正确
比如:

情况一

  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判断语句不成立,那么,最终的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'“;
  }

这样不管条件成立与否,都是正确的sql语句,相当于给了这条sql基本的查询条件

where 1 = 1 的弊端

相当于全表查询,数据量大会导致查询过慢
这里也可以采用别的拼接写法:

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

1<>1 永假

用于只取结构不取数据的场合,同理还有1=0等