我有两个表,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)
我尝试使用动态 SQL,但它给出了无效表名的错误。
SELECT * FROM ''||SCHD_TABLE||'' ;
Run Code Online (Sandbox Code Playgroud)
使用 CASE STATEMENT 但它也给出了语法错误:
SELECT * FROM (CASE WHEN REPORT_DATE<=TRUNC(SYSDATE-40) THEN HISTORY_DATA
ELSE CURRENT_DATA
END)
Run Code Online (Sandbox Code Playgroud)
请指导如何解决这个问题。
假设history_data和current_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 表达式,而不是你在那里的陈述。