“其中1 = 1”声明

时间:2011-11-16 09:12:32

标签: mysql sql database

  

可能重复:
  Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?

我看到有些人使用语句来查询MySQL数据库中的表,如下所示:

select * from car_table where 1=1 and value="TOYOTA"

1=1在这里意味着什么?

10 个答案:

答案 0 :(得分:305)

通常当人们建立SQL语句时。

当您添加and value = "Toyota"时,您不必担心之前是否存在条件,或者只是在哪里。优化者应该忽略它

没有魔力,只是实用


示例代码:

commandText = "select * from car_table where 1=1";

if (modelYear <> 0)     commandText += " and year="+modelYear
if (manufacturer <> "") commandText += " and value="+QuotedStr(manufacturer)
if (color <> "")        commandText += " and color="+QuotedStr(color)
if (california)         commandText += " and hasCatalytic=1"

否则你必须有一套复杂的逻辑:

commandText = "select * from car_table"
whereClause = "";
if (modelYear <> 0)
{
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "year="+modelYear;
}
if (manufacturer <> "")
{    
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "value="+QuotedStr(manufacturer)
}
if (color <> "")
{
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "color="+QuotedStr(color)
}
if (california)
{
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "hasCatalytic=1"
}

if (whereClause <> "")
   commandText = commandText + "WHERE "+whereClause;

答案 1 :(得分:48)

如果该查询是动态构建的,原作者可能不想考虑一组空的条件,所以以这样的结尾结束:

sql = "select * from car_table where 1=1"
for each condition in condition_set

    sql = sql + " and " + condition.field + " = " + condition.value

end

答案 2 :(得分:37)

1=1将永远为真,因此value="TOYOTA"位是重要的。

你可以在几个场景中得到这个,包括:

生成的SQL:如果您在添加第一个条件时不必解决问题,则创建生成复杂where语句会更容易,因此通常会放置1=1在开头,所有其他条件可以附加And

调试:有时你会看到人们在where条件的顶部放入1=1,因为它使他们能够在调试查询时自由切断并更改其余条件。 e.g。

select * from car_table
where 1=1
--and value="TOYOTA"
AND color="BLUE"
--AND wheels=4

必须说它不是特别好的做法,通常不应该出现在生产代码中。它甚至可能无法帮助优化查询。

答案 3 :(得分:31)

除了所有其他答案之外,这对SQL injection attacks来说也是一种简单的技巧。如果您向某个SQL添加OR where 1=1语句,那么由于表达式的固有真实性,它将返回所有结果。

答案 4 :(得分:13)

它只是一个永远真实的表达。有些人用它作为解决方法。

他们有一个静态语句,如:

select * from car_table where 1=1

因此他们现在可以使用

向where子句添加内容
and someother filter

答案 5 :(得分:4)

1 = 1其中condition始终为true,因为always 1等于1,因此该语句将始终为true。 虽然它有时没有任何意义。但其他时候开发人员在动态生成where条件时使用它。

例如,让我们看看这段代码

<?php
//not that this is just example
//do not use it like that in real environment because it security issue.
$cond = $_REQUEST['cond'];
if ($cond == "age"){
 $wherecond = " age > 18";
}         
$query = "select * from some_table where $wherecond";
?>

所以在上面的例子中,如果 $ _ REQUEST ['cond'] 不是“年龄”,查询将返回mysql错误,因为在where条件之后没有任何内容。

查询将从some_table中选择* ,这是错误

解决这个问题(至少在这个不安全的例子中)我们使用

<?php
//not that this is just example
//do not use it like that in real environment because it security issue.
$cond = $_REQUEST['cond'];
if ($cond == "age"){
 $wherecond = " age > 18";
} else {
 $wherecond = " 1=1";
}        
$query = "select * from some_table where $wherecond";
?>

所以现在如果 $ _ REQUEST ['cond'] 不是年龄,$ wherecond将是1 = 1,因此查询不会返回mysql错误。< / p>

查询将从some_table中选择*,其中1 = 1 并避免mysql错误

希望您了解我们何时使用1 = 1,同时请注意上述示例不是真实示例,只是为了向您展示这个想法。

答案 6 :(得分:4)

大部分时间开发人员使用这些类型的查询,如果他正在开发查询构建器类型应用程序或构建一些复杂的SQL查询,那么与select语句字符串一起添加条件子句其中1 = 1,并且在程序中无需添加任何检查。

答案 7 :(得分:2)

查询查找1等于1且值等于'TOYOTA'的所有行。所以在这种情况下它是无用的,但如果省略WHERE语句,使用WHERE 1 = 1提醒您选择不使用WHERE子句是个好主意。

答案 8 :(得分:1)

在动态传递条件时,使用此函数会出现在复杂查询中。您可以使用“AND”字符串连接条件。然后,不是计算您传入的条件数,而是在库存SQL语句的末尾放置一个“WHERE 1 = 1”并抛出连接条件。

无需使用1 = 1即可使用0 = 0 2 = 2,3 = 3,5 = 5 25 = 25 ......

select * from car_table where 0=0 and value="TOYOTA" 

这里也会得到相同的结果,如1 = 1条件

因为所有这些案例总是真实的表达

1=1 is alias for true

答案 9 :(得分:0)

当我需要动态应用过滤器时,我这样做了。
比如,编码我不知道将应用多少过滤器用户(fld1 = val1和fld2 = val2和......)
所以,重复声明“和fld = val”我以“1 = 1”开头。
因此,我不需要修改声明中的第一个“和”。