4

在 Oracle 过程中使用“where 0=0”之类的语句时,我有点困惑?有人可以澄清一下吗?即使我们这样做是为了动态选择,为什么即使我们在查询中附加了实际条件,我们也要添加这个语句?这 where 条件会对结果集产生任何影响吗?

我经历了 如何选择列包含字符串的任何单词的所有行

但我并不完全理解使用where 0=0. 有人可以给我使用这种条件的正当理由吗?

4

5 回答 5

7

我们使用0 = 0或通常1 = 1用作存根

select *
  from My_Table
 where 1 = 1

因此,当您编写过滤器时,您可以通过添加/注释单行来做到这一点:

-- 3 filters added
select *
  from My_Table
 where 1 = 1
   and (Field1 > 123) -- 1st
   and (Field2 = 456) -- 2nd 
   and (Field3 like '%test%') -- 3d

例如,下一个版本将删除两个过滤器:

-- 3 filters added, 2 (1st and 3d) removed
select *
  from My_Table
 where 1 = 1
   -- and (Field1 > 123) -- <- all you need is to comment out the corresponding lines
   and (Field2 = 456)
   -- and (Field3 like '%test%')

现在让我们以非常简单的方式恢复 3d 滤镜:

-- 3 filters added, 2 (1st and 3d) removed, then 3d is restored
select *
  from My_Table
 where 1 = 1
   -- and (Field1 > 123) 
   and (Field2 = 456)
   and (Field3 like '%test%') -- <- just uncomment
于 2013-08-19T08:07:49.317 回答
3

使用动态 sql 时,可能需要添加额外的子句,具体取决于是否满足某些条件。1=1 子句在查询中没有任何意义(除了它总是被满足),它的唯一用途是首先降低用于生成查询的代码的复杂性。

例如这个伪代码

DECLARE
v_text VARCHAR2(2000) := 'SELECT * FROM table WHERE 1=1 ';
BEGIN

    IF condition_a = met THEN
    v_text := v_text ||' AND column_1 = ''A'' ';
    END IF;

    IF condition_b = also_met THEN
    v_text := v_text ||' AND column_2 = ''B'' ';
    END IF;

execute_immediate(v_text);

END;

比下面的伪代码更简单,并且随着添加的子句越来越多,它只会变得更加混乱。

DECLARE
v_text VARCHAR2(2000) := 'SELECT * FROM table  ';
BEGIN

    IF condition_a = met THEN
    v_text := v_text ||' WHERE column_1 = ''A'' ';
    END IF;

    IF condition_b = also_met AND 
       condition_a != met THEN
    v_text := v_text ||' WHERE column_2 = ''B'' ';
    ELSIF condition_b = also_met AND 
       condition_a = met THEN
    v_text := v_text ||' AND column_2 = ''B'' ';
    END IF;

execute_immediate(v_text);

END;
于 2013-08-19T08:03:57.607 回答
1

它通常在需要连接 SQL Query 的字符串时使用,因此您编写第一部分:

SELECT * FROM table WHERE 1=1 

然后如果某些条件为真,您可以附加更多子句,否则将查询保持原样,它将运行而不会出现错误...

它通常用于在运行时添加更多子句,直接附加到查询的字符串中。

于 2013-08-19T07:44:06.770 回答
0

这始终为真 条件即“0”将始终等于“0”。这意味着您的条件将始终被执行。

有些人使用它来简化查询的调试。他们将把它放在 where 子句和带有 AND 子句的休息条件中,以便出于检查目的,他们可以注释不必要的条件。

例如

SELECT * from 
TABLE
WHERE 1=1
AND condition1
AND condition 2
.....

.

于 2013-08-19T08:12:14.293 回答
0

当您希望连接条件始终为真时,1=1 也很有用。例如类似的东西(将 b.value 添加到所有行):

select a.code, a.name, b.value
  from tableA a
  LEFT JOIN (SELECT MAX(value) AS value
               FROM tableB) b
    ON 1 = 1;
于 2017-09-01T13:35:13.573 回答