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

当前回答

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

and <condition>

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

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

其他回答

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

只是在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的技术细节。 我正在写一个函数,使用pyodbc从SQL Server检索一些数据。我正在寻找一种方法,在我的代码中的where关键字后强制填充。这确实是一个很好的建议:

if _where == '': _where = '1=1'
...
...
...
cur.execute(f'select {predicate} from {table_name} where {_where}')

原因是我不能在_where子句变量中一起实现关键字“where”。因此,我认为使用任何计算结果为真的虚拟条件都可以作为填充符。

使“where 1=1”成为所有查询的标准,还可以通过将其替换为where 1= 0来简单地验证sql,当您有批量命令/文件时非常方便。

这也使得查找任何查询的from/join部分的结尾变得非常容易。甚至带有子查询的查询,如果缩进得当。

回顾了所有的答案,我决定做一些实验

SELECT
*
FROM MyTable

WHERE 1=1

然后我用其他号码核对了一下

WHERE 2=2
WHERE 10=10
WHERE 99=99

等 在完成所有检查之后,查询run town是相同的。即使没有where从句。我不喜欢这种语法