为什么有人在SQL子句中使用WHERE 1=1 AND <conditions>
(通过连接字符串获得的SQL,要么是视图定义,要么]
我在某处已经看到它可以用来防止SQL注入,但是看起来很奇怪。
如果有进样,WHERE 1 = 1 AND injected OR 1=1
将具有与injected OR 1=1
相同的结果。
稍后编辑:视图定义中的用法如何?
谢谢您的回答。
还是,我不明白为什么有人会使用这种构造来定义视图,还是在存储过程中使用它。
以这个为例:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
如果条件列表在编译时未知,而是在运行时构建的,则不必担心是否有一个或多个条件。您可以生成所有类似的文件:
似乎总是知道您的WHERE子句已经定义,并且允许您继续添加条件而不必检查它是否是第一个条件的一种懒惰方式。
1 = 1表达式通常在生成的sql代码中使用。此表达式可以简化sql生成代码,减少条件语句的数量。
实际上,我已经在BIRT报告中看到过这种情况。传递给BIRT运行时的查询的形式为:
我在测试或仔细检查数据库中的内容时发现此模式很有用,因此我可以非常迅速地注释其他情况:
其中1 = 0,执行此操作以检查表是否存在。不知道为什么使用1 = 1。
虽然我可以看到1 = 1对于生成的SQL很有用,但是我在PHP中使用的一种技术是创建一个子句数组,然后执行
这是一个密切相关的示例:使用SQL MERGE
语句更新源表中的目标表,而源表中的所有值都没有共同的属性,例如
为什么有人使用WHERE 1 = 1 AND <proper conditions>
如果您来这里搜索WHERE 1
,请注意WHERE 1
和WHERE 1=1
是相同的。 WHERE 1
很少使用,因为某些数据库系统考虑到WHERE 1
并非布尔值而拒绝使用它。
这在必须使用动态查询的情况下非常有用,子句,您必须附加一些过滤器选项。就像您包含选项0表示状态为非活动,选择1表示活动。根据这些选项,只有两个可用的选项(0和1),但是如果要显示“所有记录”,在接近1 = 1的位置包含该记录将很方便。参见以下示例:
通常,我在为报表创建动态SQL时会这样做,该报表具有用户可以选择的许多下拉值。由于用户可能会或可能不会从每个下拉列表中选择值,因此我们最终很难确定哪个条件是第一个where子句。因此,我们在查询末尾加一个where 1=1
并在其后添加所有where子句。
使用谓词,例如1=1
是正常提示,有时可用于强制访问计划使用或不使用索引扫描。之所以使用此功能,是因为您在where子句中使用带有多个谓词的多嵌套联接查询,有时甚至使用所有索引也会导致访问计划读取每个表-全表扫描。这只是DBA用来诱使dbms使用更有效的路径的众多提示之一。只是不要扔进去;您需要一个dba来分析查询,因为它并不总是有效。
这里是一个用例...但是我不太担心为什么不应该使用1 = 1的技术性。我正在编写一个函数,使用pyodbc从SQL Server检索一些数据。我正在寻找一种在代码中的where关键字后面强制填充符的方法。这确实是一个很好的建议:
我首先使用ADO和经典ASP遇到了这个问题,我得到的答案是:
性能。