43

可能的重复:
为什么 sql 查询会有“where 1 = 1”
为什么有人会在 SQL 子句中使用 WHERE 1=1 AND <conditions>?

我在不同的查询示例中看到了很多,它可能适用于所有 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;

是否有任何理由添加该额外条件?

4

6 回答 6

40

当人们以编程方式构建 sql 查询时,这也是一种常见的做法,从 'where 1=1' 开始,然后根据是否提供客户 ID 附加 ' 和 customer.id=:custId' 会更容易。因此,您始终可以附加以“and ...”开头的查询的下一部分。

于 2009-08-12T07:23:35.493 回答
28

1 =1总是被所有 rdbms 忽略。使用WHERE 1=1执行查询没有折衷。

构建动态 WHERE 条件,如 ORM 框架或其他经常做的事情,附加真实的where 条件更容易,因为您避免检查在当前条件前面加上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());
}
于 2009-08-12T07:37:20.660 回答
21

人们使用它是因为他们在构建动态 SQL 查询时天生就懒惰。如果您以 a 开头,"where 1 = 1"那么您所有的额外条款都只是以开头,"and"您不必弄清楚。

并不是说天生懒惰有什么问题。我见过双向链表,其中“空”列表由两个哨兵节点组成,您从上到下开始处理,first->next直到last->prev包含在内。

这实际上删除了所有用于删除firstlast节点的特殊处理代码。在此设置中,每个节点都是中间节点,因为您无法删除firstlast. 浪费了两个节点,但代码更简单并且(稍微)更快。

我见过的“1 = 1”构造的唯一其他地方是 BIRT。报告通常使用位置参数并使用 Javascript 进行修改以允许所有值。所以查询:

select * from tbl where col = ?

当用户选择"*"用于的参数被col修改为:

select * from tbl where ((col = ?) or (1 = 1))

这允许使用新查询而无需摆弄位置参数详细信息。仍然只有一个这样的参数。任何体面的 DBMS(例如 DB2/z)都会在尝试构建执行计划之前优化该查询以基本上完​​全删除该子句,因此没有权衡取舍。

于 2009-08-12T07:52:53.000 回答
13

是的,这通常是因为它以 'where 1 = 0' 开始,以强制语句失败。

这是一种更天真的方式,将其包装在事务中而不是在最后提交,以测试您的查询。(这是首选方法)。

于 2009-08-12T07:21:01.397 回答
1

如你所说:

如果您要动态添加条件,则不必担心剥离初始条件,这可能是唯一的原因,您是对的。

于 2009-08-12T07:27:42.523 回答
-1

使用 1=1 实际上不是一个好主意,因为这本身会导致全表扫描。

看到这个--> T-SQL 1=1 性能命中

于 2009-08-12T07:21:42.393 回答