为什么有人会在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

当前回答

如果您在这里搜索WHERE 1,请注意WHERE 1和WHERE 1=1是相同的。很少使用WHERE 1,因为一些数据库系统认为WHERE 1不是布尔值而拒绝使用它。

其他回答

我通常在为一个有许多用户可以选择的下拉值的报告构建动态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 AND <适当条件>

我曾经见过简单的框架做这样的事情(脸红),因为这允许将惰性解析实践应用于WHERE和and Sql关键字。

例如(我在这里使用c#作为示例),考虑在Sql查询字符串构建器中对以下谓词的条件解析:

var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1"
if (shouldFilterForBars)
{
    sqlQuery = sqlQuery + " AND Bars > 3";
}
if (shouldFilterForBaz)
{
    sqlQuery = sqlQuery + " AND Baz < 12";
}

WHERE 1 = 1的“好处”意味着不需要特殊的代码:

对于AND——应该应用零、一个或两个谓词(Bars和Baz’s),这将决定是否需要第一个AND。因为我们已经有了至少一个1 = 1的谓词,它意味着AND总是OK的。 对于根本没有谓词的情况-在有0个谓词的情况下,则必须删除where。但同样,我们可以偷懒,因为我们再次保证至少有一个谓词。

这显然是一个坏主意,建议使用已建立的数据访问框架或ORM以这种方式解析可选和条件谓词。

只是在Greg的回答中添加了一个示例代码:

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if

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

我发现这个模式在我测试或重复检查数据库上的东西时很有用,所以我可以很快地注释其他条件:

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

变成:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
--AND Table.Field=Value
--AND Table.IsValid=true