在SQL语句中使用WHERE 1 = 1的目的是什么?

时间:2009-08-12 07:18:51

标签: sql conditional-statements where

  

可能重复:
  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;

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

6 个答案:

答案 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为止。

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

我见过的唯一一个“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   这是唯一的原因,你是对的。