2009-08-12 99 views
8

可能重复:
Why would a sql query have “where 1 = 1”
Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?在SQL语句中使用WHERE 1 = 1的目的是什么?

我已经看到了很多不同的查询例子,它关系到可能是所有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` = '[email protected]' 
LIMIT 1; 

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

+1

Dupe of http://stackoverflow.com/questions/517107/why-would-a-sql-query-have-where-1-1其中 – 2009-08-12 07:25:27

回答

4

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

这是一种更为幼稚的方式,将它包装在一个事务中,而不是在最后提交它来测试你的查询。 (这是首选方法)。

+0

可以有多个答案;在这种情况下,OP明确指出,它不仅仅是用于构建动态查询(并且说实话,如果在ORM的这些日子里构建动态查询,请仔细看看自己)。 – 2009-08-12 07:52:02

2

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

请参阅本 - >T-SQL 1=1 Performance Hit

+1

只有在DBMS最棘手的。 – paxdiablo 2009-08-12 07:43:10

+1

所链接的问题中所有答案都表示1 = 1没有影响。 – Ryan 2009-08-12 13:08:22

13

这也是一种常见的做法,当人们构建SQL查询编程,它只是更容易下手“其中1 = 1”,然后附加'和customer.id =:custId'取决于是否提供了客户ID。 因此,您始终可以追加以'和...'开头的查询的下一部分。

+1

-1这是重复的问题,其中说:“你不必担心剥离最初的AND” – Andomar 2009-08-12 08:26:08

1

至于你说:

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

4

1 = 1通过总是所有RDBMS忽略。没有权衡执行查询与哪里1 = 1

构建动态WHERE条件,像ORM框架或其他做的非常频繁,更容易追加真正有条件的地方,因为你避免检查前置一个当前的状态。

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()); 
} 
+1

实际上,我倾向于做类似:cmd =“select ...”; sep =“where”; foreach(cond){cmd + = sep + cond; sep =“and”; } – paxdiablo 2009-08-12 07:57:03

+0

看起来很少*清洁剂。 – paxdiablo 2009-08-12 07:57:41

+0

好主意!我记住进一步的编程。 – Christian13467 2009-08-16 19:49:39

3

人们使用它,因为它们在构建动态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)都会优化该查询,以便在尝试构建执行计划之前基本上完全删除该子句,因此不存在折衷。

+0

谢谢兄弟!这是最合理的答案! – 2015-09-30 12:17:30

相关问题