为什么有人会在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=2时:

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

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

其他回答

where 1=0,这是为了检查表是否存在。不知道为什么使用1=1。

我曾见过在条件数量可变的情况下使用这种方法。

您可以使用“AND”字符串连接条件。然后,不计算传入的条件的数量,而是在stock SQL语句的末尾放置“WHERE 1=1”,并抛出连接的条件。

基本上,它使您不必对条件进行测试,然后在它们之前添加“WHERE”字符串。

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

SELECT
*
FROM MyTable

WHERE 1=1

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

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

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

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

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