"其中1 = 1"声明

Mel*_*lon 198 mysql sql database

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

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

select * from car_table where 1=1 and value="TOYOTA"
Run Code Online (Sandbox Code Playgroud)

1=1这里的意思是什么?

gbn*_*gbn 314

通常当人们建立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"
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

  • 虽然更有经验的程序员会做类似"和".Join(条件)`来生成where语句......或者使用O/RM ...... (73认同)
  • 真棒.现在我可以使用字符串而不是数组来构建复杂的查询;).但是,我确实想要使用EXPLAIN查询来验证它是否触发了"使用位置".实际上,它没有. (2认同)
  • 如果你正在构建"或"的东西,你应该从"where false"或"where 1 = 0"开始. (2认同)
  • `conditions.join(" and ")` 的问题是,如果 `conditions.length == 0` 你最终会得到一个悬空的 `where`。所以有经验的程序员实际上会使用“1=1”。 (2认同)

Rub*_*ias 49

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

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

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

end
Run Code Online (Sandbox Code Playgroud)

  • IMO这只是糟糕的编码.我个人将所有条件存储在一个数组中,然后用"AND"将它们粘在一起. (27认同)
  • @DisgruntledGoat - 这绝对是一种更好的做事方式; 但有时你不会轻易操纵数组和数组连接语句. (12认同)
  • 我相信它更像是"和" (3认同)
  • 在编程代码中存储一组数据库过滤条件是一个很好的*开发实践?"where 1 = 1"是存储过程模式中的经典动态sql. (3认同)
  • @BenW您不需要易于操作数组和数组连接语句来执行 `if (first) { s += " WHERE"; 首先=假;} else { s += “与”; }` (2认同)

Jon*_*ton 37

1=1将永远是真的,所以这value="TOYOTA"一点是重要的.

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

生成的SQL:where如果您不必添加第一个条件,则更容易创建生成复杂语句,因此通常将a 1=1放在开头,并且所有其他条件都可以附加一个And

调试:有时您会看到人们放在1=1where条件的顶部,因为它使他们能够在调试查询时自由切换并更改其余条件.例如

select * from car_table
where 1=1
--and value="TOYOTA"
AND color="BLUE"
--AND wheels=4
Run Code Online (Sandbox Code Playgroud)

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


Jef*_*ter 31

除了所有其他答案,它是一种简单的SQL注入攻击技术.如果您OR where 1=1向某些SQL 添加语句,那么由于表达式的固有真实性,它将返回所有结果.

  • 问题是"1 = 1是什么意思",我只是认为它是一个有用的例子来展示如何使用它. (4认同)

Udo*_*eld 16

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

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

select * from car_table where 1=1
Run Code Online (Sandbox Code Playgroud)

所以他们现在可以在where子句中添加一些内容

and someother filter
Run Code Online (Sandbox Code Playgroud)