可能重复:
Why would a sql query have “where 1 = 1”
Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?
我在不同的查询示例中看到了很多内容,它可能适用于所有SQL引擎。
如果存在没有条件定义的查询,那么人们(特别是ORM框架)通常会添加始终为真的条件WHERE 1 = 1
或类似的东西。
所以而不是
SELECT id, name FROM users;
他们使用
SELECT id, name FROM users WHERE 1 = 1;
如果你动态添加条件,我可以想到的唯一可能的原因你不必担心剥离初始AND
,但是如果有一个1 = 1
条件仍然经常被删除查询中的实际情况。
CakePHP的实际示例(由框架生成):
(无条件)
SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1
ORDER BY `User`.`id` ASC;
(有条件)
SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User`
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;
是否有任何理由增加额外条件?
答案 0 :(得分:15)
当人们以编程方式构建sql查询时,这也是一种常见的做法,只需从'where 1 = 1'开始然后追加'和customer.id =:custId',这取决于是否提供客户ID。 因此,您始终可以附加以'和...'开头的查询的下一部分。
答案 1 :(得分:7)
始终所有rdbms都会忽略 1 = 1 。使用 WHERE 1 = 1 执行查询没有权衡。
构建动态WHERE条件,如ORM框架或其他常常做的事情,更容易将 real 附加到条件中,因为您避免检查是否在 AND 之前添加了 AND 现状。
stmt += "WHERE 1=1";
if (v != null) {
stmt += (" AND col = " + v.ToString());
}
这是没有1 = 1的情况。
var firstCondition = true;
...
if (v != null) {
if (!firstCondition) {
stmt += " AND ";
}
else {
stmt += " WHERE ";
firstCondition = false;
}
stmt += "col = " + v.ToString());
}
答案 2 :(得分:6)
是的,这通常是因为它从'1 = 0'开始,以强制语句失败。
这是一种更简单的方式将它包装在一个事务中,而不是最后提交它来测试你的查询。 (这是首选方法)。
答案 3 :(得分:5)
人们使用它是因为在构建动态SQL查询时它们本身就是懒惰的。如果您从"where 1 = 1"
开始,则所有额外条款都以"and"
开头,您无需弄清楚。
并不是因为天生懒惰而有任何不妥之处。我见过双链表,其中“空”列表由两个标记节点组成,您开始在first->next
处理,直到last->prev
为止。
这实际上删除了删除first
和last
个节点的所有特殊处理代码。在此设置中,每个节点都是一个中间节点,因为您无法删除first
或last
。浪费了两个节点,但代码更简单,而且(更轻微)更快。
我见过的唯一一个“1 = 1”构造的地方是BIRT。报告通常使用位置参数,并使用Javascript进行修改以允许所有值。所以查询:
select * from tbl where col = ?
当用户选择"*"
时,用于col
的参数被修改为:
select * from tbl where ((col = ?) or (1 = 1))
这允许使用新查询而无需摆弄位置参数细节。还有一个这样的参数。任何体面的DBMS(例如,DB2 / z)都会优化该查询,以便在尝试构建执行计划之前完全删除该子句,因此不需要权衡。
答案 4 :(得分:3)
使用1 = 1实际上不是一个好主意,因为这可能会导致全表扫描。
看到这个 - &gt; T-SQL 1=1 Performance Hit
答案 5 :(得分:1)
正如你所说:
如果您要添加条件 动态你不必担心 关于剥离初始AND 这是唯一的原因,你是对的。