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

当前回答

在生产代码中看到了这一点,并向前辈寻求帮助。

他们的回答:

-我们使用1=1,所以当我们必须添加一个新的条件时,我们只需输入

and <condition>

然后继续做下去。

其他回答

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

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

Using a predicate like 1=1 is a normal hint sometimes used to force the access plan to use or not use an index scan. The reason why this is used is when you are using a multi-nested joined query with many predicates in the where clause where sometimes even using all of the indexes causes the access plan to read each table - a full table scan. This is just 1 of many hints used by DBAs to trick a dbms into using a more efficient path. Just don't throw one in; you need a dba to analyze the query since it doesn't always work.

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

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

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

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