为什么有人会在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子句已经定义,并允许您继续添加条件,而不必检查它是否是第一个条件。

其他回答

似乎是一种懒惰的方式,总是知道WHERE子句已经定义,并允许您继续添加条件,而不必检查它是否是第一个条件。

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

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

他们的回答:

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

and <condition>

然后继续做下去。

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

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

这在必须使用动态查询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);