如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?

Posted

技术标签:

【中文标题】如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?【英文标题】:How to use select with if condition with different tables in oracle rather than writing a function or stored procedure? 【发布时间】:2016-11-24 21:01:57 【问题描述】:

我的要求是使用 if 语句从复杂查询中获取报告。

如果flag=0我必须执行一组select语句,如果flag = 1我必须从另一个表执行另一组select语句,

有什么方法可以在查询中实现这一点,而不是编写函数或存储过程?

例如: 在 SQL 中我这样做

if flag = 0  
      select var1, vari2 from table1  
else  
      select var1, vari2, var3, vari4 from table2

这可能吗??

【问题讨论】:

如果你想构建一个返回可变列数的普通 SQL,你不能。 【参考方案1】:

SQL 中没有if - 有case 表达式,但它并不完全相同。

如果您有两个表t1t2,并且flag 在一个标量表t3 中(“标量”表示正好是一列flag,并且正好是一行,使用值01),你可以做你想做的事,但前提是t1t2 具有相同的列数,具有相同的数据类型(并且,尽管语法不要求,但这将仅当t1t2 中的列具有相同的业务含义时才有意义)。或者,至少,如果您打算只从t1t2 中选择一些列,那么您要从任一表中选择的列的数量应该相同,具有相同的数据类型,并且最好具有相同的业务含义.

例如:t1t2 可能是员工表,可能是刚刚合并的两家公司。如果它们都包含first_name, last_name, date_of_birth,并且您只想根据flag 值从t1t2 中选择这三列(即使t1 有其他列,但t2 中不存在),你能行的。如果t1t2 或两者都不是单个表,而是更复杂查询的结果,则相同。原理是一样的。

您可以使用UNION ALL 来做到这一点,如下所示:

select t1.col1, t1.col2, ...
from   t1 cross join t3
where  t3.flag = 0
UNION ALL
select t2.col1, t2.col2, ...
from   t2 cross join t3
where  t3.flag = 1
;

【讨论】:

谢谢,但是,联合都只适用于相同数量的列,在我的情况下,我在第一个查询中有两列,在第二个查询中有四列。 @EdgarConrado - 那么这不是你可以在 SQL 中做的事情。您可能会在 PL/SQL 或 Java 或 C# 或其他语言中执行此操作。

以上是关于如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL 中将变量设置为 select 语句的结果

如何在 UNIX 批处理作业中将备份作为来自 oracle select 语句的插入查询?

ORACLE 中的 PL/SQL、IF-ELSE 或 SELECT DECODE 哪个更好

如何在 Oracle 中将多行组合成逗号分隔的列表? [复制]

在 PDO 准备语句中将查询与 if else 连接

ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0