根据 with 子句中的条件选择要使用的 select 语句
Posted
技术标签:
【中文标题】根据 with 子句中的条件选择要使用的 select 语句【英文标题】:Choose select statement to use based on condition in with clause 【发布时间】:2019-06-21 13:56:28 【问题描述】:我想根据 Oracle 中的布尔条件选择要使用的选择。我必须在 With 子句中执行此操作。
我尝试并注意到我必须从 with 子句中的 select 语句开始,否则我会收到错误。这意味着我不能做类似的事情:
with variable_1 as (
select * from tableA
), variable_2 as(
if (true) then
begin
select * from tableB
end if;
end;
if (false) then
begin
select * from tableC
end if;
end;
)
select v1.name, v2.surname
from variable_1 v1, variable_2 v2;
我想达到以下条件:
with variable_1 as (
select * from tableA
), variable_2 as(
--If condition is true select from tableB as below
select * from tableB
--If condition is false select from tableC as below
select * from tableC
)
select v1.name, v2.surname
from variable_1 v1, variable_2 v2;
如果条件为真,那么我们应该只从 tableB 中选择而不使用 tableC 和 如果条件为假,那么我们应该只从 tableC 中选择而不使用 tableB
【问题讨论】:
我认为你做不到。 @OldProgrammer 有解决办法吗? @Etch - 你可以轻松做到这一点 - 我只是在答案中展示了如何。 @mathguy 我使用了 union all 但我删除 union all 的原因是我不想运行两个 select 语句来优化代码。我想根据条件在一个选择中运行,因为实际上它是一个很大的选择查询 请显示此布尔条件(必须基于某些来源)和大选择查询(可能来源)。可能有一种紧凑、干燥的方式来做到这一点。没有这些细节,我们就是在拍摄空白。 【参考方案1】:只有当两个表具有相同的列(意思是:相同的列数、相同的数据类型)时,您才可以将select *
用于表B
和C
所显示的“期望行为” ,以相同的顺序 - 如果两个表中的列名不同,任何对列名的引用都将遵循表 B
名称)。
如果不是这样,您可以将select
更改为仅选择常用列。例如,在外部选择中您只使用surname
,因此您可能只需要从任一表中选择那一列。
话虽如此:你可以这样做
...
variable_2 as (
select surname from tableB WHERE <YOUR_CONDITION> -- meaning, where it is TRUE
UNION ALL
select surname from tableC WHERE <NOT YOUR_CONDITION>
如果需要(可能是其他原因),您也可以使用两个表中的select *
,但前提是满足我第一段(上文)中的条件。
【讨论】:
我没有使用union all的原因是我不想运行两个select语句来优化代码。 @Etch - Oracle 将评估WHERE
访问条件 - 它不会触及您不需要的表。尝试一下,你会看到的。
因为它是一个联合表 tableC 肯定会被查询,我想避免这种情况,因为实际上它是一个大的选择查询。所以最好根据条件只运行一个查询
@Etch 如果保证该联合分支的所有行的条件为假,则数据库将不会访问该表。例如,请参阅asktom.oracle.com/pls/apex/…
I did not want to run two select statements
... 您要么必须重复整个查询,要么重复您的子查询之一。除非您想走动态 SQL 的崎岖道路,但在这种情况下我不会这样做。静态 SQL 更容易理解和维护。以上是关于根据 with 子句中的条件选择要使用的 select 语句的主要内容,如果未能解决你的问题,请参考以下文章