为什么有人会在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
这在必须使用动态查询in which in where的情况下很有用
子句,则必须附加一些筛选选项。比如,如果你包含选项0表示状态为非活动,1表示活动。根据选项,只有两个可用选项(0和1),但如果您想显示所有记录,可以方便地在close 1=1的位置包含。
见以下样本:
Declare @SearchValue varchar(8)
Declare @SQLQuery varchar(max) = '
Select [FirstName]
,[LastName]
,[MiddleName]
,[BirthDate]
,Case
when [Status] = 0 then ''Inactive''
when [Status] = 1 then ''Active''
end as [Status]'
Declare @SearchOption nvarchar(100)
If (@SearchValue = 'Active')
Begin
Set @SearchOption = ' Where a.[Status] = 1'
End
If (@SearchValue = 'Inactive')
Begin
Set @SearchOption = ' Where a.[Status] = 0'
End
If (@SearchValue = 'All')
Begin
Set @SearchOption = ' Where 1=1'
End
Set @SQLQuery = @SQLQuery + @SearchOption
Exec(@SQLQuery);
为什么有人会使用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以这种方式解析可选和条件谓词。