如何在FROM子句中使用CASE语句来决定使用哪个表来获取Oracle中的数据?

我有两个表,HISTORY_DATA 和 CURRENT_DATA,我有一个输入参数 REPORT_DATE,根据以下条件,我必须获取数据:

IF(REPORT_DATE<=TRUNC(SYSDATE-40))THEN
         SCHD_TABLE:='HISTORY_DATA' ;
         ELSE
         SCHD_TABLE:='CURRENT_DATA';  
         END IF ; 
  1. 我尝试使用动态 SQL,但它给出了无效表名的错误。

    SELECT * FROM ''||SCHD_TABLE||'' ;
    
  2. 使用 CASE STATEMENT 但它也给出了语法错误:

    SELECT * FROM (CASE WHEN REPORT_DATE<=TRUNC(SYSDATE-40) THEN HISTORY_DATA 
                        ELSE CURRENT_DATA 
                   END)
    

请指导如何解决这个问题。

回答

假设history_datacurrent_data具有等效列,则可以使用UNION ALL和 两个查询。SELECT当且仅当依赖于WHERE子句中变量的条件为真时,每个查询都来自表中的所有内容。由于WHERE子句中的条件相互否定,当另一个查询返回某些内容时,另一个查询将返回一个空集。所以你只能根据你的条件从你想要的表中得到结果。

SELECT *
       FROM history_data
       WHERE report_date <= trunc(sysdate - 40)
UNION ALL
SELECT *
       FROM current_data
       WHERE report_date > trunc(sysdate - 40);

顺便说一下,它是一个CASE 表达式,而不是你在那里的陈述。


以上是如何在FROM子句中使用CASE语句来决定使用哪个表来获取Oracle中的数据?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>