什么是0 = 0的条件的确切含义是什么?

时间:2013-08-19 07:39:27

标签: sql oracle procedures

我在使用Oracle程序中的“where 0 = 0”这样的语句时有点困惑?有人可以澄清一下吗?尽管我们是为动态选择而做的,但即使我们在查询中附加实际条件,为什么还要添加此语句?这个条件会对结果集产生什么影响吗? 我经历了 How can I Select all rows where column contain any words of a string? 但我完全理解使用“where 0 = 0”的原因。 有人可以告诉我使用这种情况的正当理由吗?

先谢谢..;)

5 个答案:

答案 0 :(得分:5)

我们使用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

答案 1 :(得分:2)

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

E.g。这个伪代码

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;

答案 2 :(得分:1)

通常在需要连接SQL查询的字符串时使用,所以编写第一部分:

SELECT * FROM table WHERE 1=1 

然后如果某些条件为真,你可以附加更多子句,否则保持查询原样,它将运行没有错误......

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

答案 3 :(得分:0)

这始终是真的条件,即'0'将始终等于'0'。这意味着你的状况将永远执行。

有些人使用它来轻松调试查询。他们会把它放在带有AND子句的where子句和rest条件中,这样为了检查目的,他们可以评论不必要的条件。

前者

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

答案 4 :(得分:0)

当您希望连接条件始终为true时,

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;