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

当前回答

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

SELECT
*
FROM MyTable

WHERE 1=1

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

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

等 在完成所有检查之后,查询run town是相同的。即使没有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以这种方式解析可选和条件谓词。

间接相关:当使用1=2时:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

这将创建一个与旧表具有相同模式的新表。(非常方便,如果你想加载一些数据进行比较)

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

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

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

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