可能重复:
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
在这里意味着什么?
答案 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”开头。
因此,我不需要修改声明中的第一个“和”。