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