我的Oracle存储过程中有如下代码:
SELECT COUNT(EMP_ID) INTO A_VARIABLE
FROM STUDENT;
IF (A_VARIABLE > 0) THEN
SELECT * FROM DEPARTMENT1;
ELSE
SELECT * FROM DEPARTMENT2;
END IF;
基本上,我必须在SQL查询中(而不是在过程或脚本中)对行进行相同的过滤。
有人能帮助解决这个Oracle查询吗?
我尝试了多种解决方案,但没有得到所需的输出。
3条答案
按热度按时间azpvetkf1#
对于19c(19.7和更高版本),您可以使用
SQL_MACRO(table)
特性和内联函数声明。但是同一个查询的不同输出结构有些误导,所以我建议使用
union all
方法并对齐两个表的列。下面是SQL宏的示例。
设置:
运行1:
| 识别号|确认|
| - ------|- ------|
| 1个|1个|
| 第二章|第二章|
| 三个|三个|
| 四个|四个|
运行2:
| 识别号|确认|STR2|
| - ------|- ------|- ------|
| 1个|零零零一|东方九号|
| 第二章|小零零零二|超高频高频|
| 三个|小零零零三|欧盟12B|
fiddle
vsnjm48y2#
示例
student
表;根据学生所选的课程,main query 将从一个表(或另一个表)返回数据。SQL〉选择 * 学生;
查询使用CTE对
student
表中的行进行计数;然后在exists
子查询中用于两个 * 相似 * 的select
语句,这两个语句从departments
表之一获取行。目前,IT部门没有人,因此departments 2表为:
但是,如果有人研究IT,
department1
将提供数据:7kqas0il3#
最接近你想做的事(只使用SQL)将意味着您需要知道两个表中的所有列名和数据类型。你必须为一个联合查询做数据类型转换,因为你必须选择相同数量的具有相同数据类型的列。2结果会有你所需要的一切,除了一些空列(那些确实存在于其他表中,但不存在于您正在从中选择的表中)。根据列的总数以及名称和类型的差异,这可能会变得过于复杂,您真的应该考虑一些函数和引用查询。
无论如何,让我们创建一些示例数据来使用:
当来自学生的计数= 0时返回(使用where子句过滤掉)
学生计数〉0时重新生成
1.创建另一个cte(转置)来取消透视上述数据
当学生计数= 0时重新生成
学生计数〉0时重新生成
1.主sql -将数据透视到两个表中的列
当学生计数= 0时重新生成
学生计数〉0时重新生成