“where 1 = 1”语句

可能重复:
为什么有人在SQL子句中使用WHERE 1 = 1 AND <conditions>?

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

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

但是1=1是什么意思?

通常当人们build立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; 

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

 sql = "select * from car_table where 1=1" for each condition in condition_set sql = sql + " and " + condition.field + " = " + condition.value end 

1=1将始终为真,所以value="TOYOTA"位是重要的。

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

生成的SQL:如果您不需要添加第一个条件,那么创build生成复杂的where语句会更容易,因此经常在开始处放置1=1 ,而其他所有条件都可以附加一个And

debugging:有时你会发现人们在where条件的顶部放置了1=1 ,因为它使得他们能够在debugging查询时自由切割和改变其余条件。 例如

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

不得不说,这是不是特别好的做法,通常不应该在生产守则中出现。 它甚至可能无助于查询的优化。

以及所有其他答案,这是一个简单的SQL注入攻击技术。 如果OR where 1=1某个SQL中添加OR where 1=1语句的OR where 1=1则由于expression式的内在真实性,将返回所有结果。

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

他们有一个静态的声明,如:

 select * from car_table where 1=1 

所以他们现在可以在where子句中添加一些东西

 and someother filter 

1 = 1,其中条件总是为真,因为总是1等于1,所以这个语句总是为真。 虽然有时候没有任何意义。 但是其他时候开发人员在dynamic生成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']不是“ age ”,查询将返回mysql错误,因为where条件之后什么也没有。

该查询将被select* from some_table哪里 ,那是错误的

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

 <?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错误返回。

查询将select* some_table其中1 = 1,并避免了mysql错误

希望你明白我们使用1 = 1的时候,注意上面的例子不是现实世界的例子,只是为了向你展示这个想法。

大多数时候,开发人员使用这些types的查询,如果他正在开发一个查询生成器types的应用程序或build立一些复杂的SQL查询,所以随着select语句string添加条件子句where 1 = 1,在程序中不需要添加任何检查它。

查询查找1等于1且值等于“TOYOTA”的所有行。 所以在这种情况下它是没有用的,但是如果你省略了一个WHERE语句,那么使用WHERE 1 = 1来提醒你,你select了不使用WHERE子句是一个好主意。

在dynamic传递条件时使用这种复杂查询,您可以使用“AND”string连接条件。 然后,不要计算传入的条件数量,而是在股票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条件一样的结果

因为所有这些情况总是真实的expression

 1=1 is alias for true 

我这样做,当我需要dynamic应用filter。
喜欢,而编码我不知道有多lessfilter用户将适用(fld1 = val1和fld2 = val2和…)
所以,重复陈述“和fld = val”,我从“1 = 1”开始。
因此,我不需要修改声明中的第一个“和”。