在 Oracle 过程中使用“where 0=0”之类的语句时,我有点困惑?有人可以澄清一下吗?即使我们这样做是为了动态选择,为什么即使我们在查询中附加了实际条件,我们也要添加这个语句?这 where 条件会对结果集产生任何影响吗?
我经历了 如何选择列包含字符串的任何单词的所有行?
但我并不完全理解使用where 0=0
. 有人可以给我使用这种条件的正当理由吗?
在 Oracle 过程中使用“where 0=0”之类的语句时,我有点困惑?有人可以澄清一下吗?即使我们这样做是为了动态选择,为什么即使我们在查询中附加了实际条件,我们也要添加这个语句?这 where 条件会对结果集产生任何影响吗?
我经历了 如何选择列包含字符串的任何单词的所有行?
但我并不完全理解使用where 0=0
. 有人可以给我使用这种条件的正当理由吗?
我们使用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
使用动态 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;
它通常在需要连接 SQL Query 的字符串时使用,因此您编写第一部分:
SELECT * FROM table WHERE 1=1
然后如果某些条件为真,您可以附加更多子句,否则将查询保持原样,它将运行而不会出现错误...
它通常用于在运行时添加更多子句,直接附加到查询的字符串中。
这始终为真 条件即“0”将始终等于“0”。这意味着您的条件将始终被执行。
有些人使用它来简化查询的调试。他们将把它放在 where 子句和带有 AND 子句的休息条件中,以便出于检查目的,他们可以注释不必要的条件。
例如
SELECT * from
TABLE
WHERE 1=1
AND condition1
AND condition 2
.....
.
当您希望连接条件始终为真时,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;