如何在 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
表达式,但它并不完全相同。
如果您有两个表t1
和t2
,并且flag
在一个标量表t3
中(“标量”表示正好是一列flag
,并且正好是一行,使用值0
或1
),你可以做你想做的事,但前提是t1
和t2
具有相同的列数,具有相同的数据类型(并且,尽管语法不要求,但这将仅当t1
和t2
中的列具有相同的业务含义时才有意义)。或者,至少,如果您打算只从t1
或t2
中选择一些列,那么您要从任一表中选择的列的数量应该相同,具有相同的数据类型,并且最好具有相同的业务含义.
例如:t1
和 t2
可能是员工表,可能是刚刚合并的两家公司。如果它们都包含first_name, last_name, date_of_birth
,并且您只想根据flag
值从t1
或t2
中选择这三列(即使t1
有其他列,但t2
中不存在),你能行的。如果t1
或t2
或两者都不是单个表,而是更复杂查询的结果,则相同。原理是一样的。
您可以使用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 哪个更好