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

rad*_*dha 0 sql oracle plsql

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

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

    SELECT * FROM ''||SCHD_TABLE||'' ;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 CASE STATEMENT 但它也给出了语法错误:

    SELECT * FROM (CASE WHEN REPORT_DATE<=TRUNC(SYSDATE-40) THEN HISTORY_DATA 
                        ELSE CURRENT_DATA 
                   END)
    
    Run Code Online (Sandbox Code Playgroud)

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

sti*_*bit 5

假设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);
Run Code Online (Sandbox Code Playgroud)

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