为什么有人会在SQL子句中使用WHERE 1=1 AND <条件>(通过连接字符串获得的SQL,或者视图定义)

我在某个地方看到过,这将用于防止SQL注入,但这看起来非常奇怪。

如果有一个注入WHERE 1=1和注入OR 1=1将有相同的结果注入OR 1=1。

稍后编辑:视图定义中的用法如何?


谢谢你的回答。

尽管如此, 我不明白为什么有人会使用这种结构来定义视图,或者在存储过程中使用它。

举个例子:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value

当前回答

我通常在为一个有许多用户可以选择的下拉值的报告构建动态SQL时这样做。由于用户可以从每个下拉列表中选择值,也可以不选择,我们最终很难弄清楚哪个条件是第一个where子句。因此,我们在最后用where 1=1填充查询,并在其后添加所有where子句。

类似的

select column1, column2 from my table where 1=1 {name} {age};

然后我们将像这样构建where子句,并将其作为参数值传递

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

由于我们在运行时不知道where子句的选择,所以这在查找是否包含“AND”或“where”方面帮助我们很大。

其他回答

似乎是一种懒惰的方式,总是知道WHERE子句已经定义,并允许您继续添加条件,而不必检查它是否是第一个条件。

1 = 1表达式常用于生成的SQL代码中。该表达式可以简化sql生成代码,减少条件语句的数量。

我曾见过在条件数量可变的情况下使用这种方法。

您可以使用“AND”字符串连接条件。然后,不计算传入的条件的数量,而是在stock SQL语句的末尾放置“WHERE 1=1”,并抛出连接的条件。

基本上,它使您不必对条件进行测试,然后在它们之前添加“WHERE”字符串。

这里有一个密切相关的例子:使用SQL MERGE语句来更新目标表,使用源表中的所有值,其中没有可以连接的公共属性。

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;

如果条件列表在编译时不知道,而是在运行时构建,则不必担心是否有一个或多个条件。你可以像这样生成它们:

and <condition>

然后把它们连在一起。1=1在开头,首字母和有关联。

我从来没见过这个用于任何注射保护,就像你说的,它似乎没有多大帮助。我曾看到它被用作一种实现方便。SQL查询引擎最终会忽略1=1,因此它不会对性能产生影响。