根据 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 * 用于表BC 所显示的“期望行为” ,以相同的顺序 - 如果两个表中的列名不同,任何对列名的引用都将遵循表 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 语句的主要内容,如果未能解决你的问题,请参考以下文章

获取的关联中不允许使用 with 子句

在SQL中分组查询 Group by 的存在条件是啥

SQL 优化 where 子句中的条件

如何使用SQL中的“With”子句更新值

在 HiveQL 的“on”子句中使用 case 语句进行条件连接

Neo4j Cypher - 有条件的 With 子句查询