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等