首页 > 解决方案 > SQL 选择分区中的动态值

问题描述

正如标题所说,是否可以在SELECT期间在 Paritition 中放置一个动态值?
我一直在堆栈中寻找答案,但找不到解决方案。

例子

SELECT
    TB1.TB_ID,
    TB1.EFF_DATE
FROM
    TABLE TABLE1 PARTITION (D20191230) TB1, TABLE2 PARTITION (D20191230) TB2
WHERE
    TB1.EFF_DATE >= TO_DATE(:p_req_date, 'yyyymmdd') 
AND 
    TB1.EFF_DATE < TO_DATE(:p_req_date, 'yyyymmdd') + 1
AND
    TB1.TB_ID = TB2.TB_ID

是否可以将分区值转换为

('D' + :p_req_date)

其中 :p_req_date 也将在 yyyymmdd


我已经尝试过 concat 和 subquery 但似乎没有任何点击。

任何帮助将不胜感激,谢谢!

标签: sqloracle

解决方案


您可以使用动态查询

我有一个表stu_data,它有一个名为 的分区SYS_P389,下面是如何使用分区的动态名称的示例execute immediate(动态 SQL)

SQL> SET SERVEROUT ON
SQL>
SQL> DECLARE
  2      LV_ROLL_NO   STU_DATA.ROLL_NO%TYPE;
  3      LV_P3898     VARCHAR2(100) := 'P3898';
  4  BEGIN
  5      EXECUTE IMMEDIATE 'select max(roll_no) from stu_data partition (SYS_'
  6                        || LV_P3898
  7                        || ')'
  8      INTO LV_ROLL_NO;
  9      DBMS_OUTPUT.PUT_LINE('output: ' || LV_ROLL_NO);
 10  END;
 11  /
output: 1

PL/SQL procedure successfully completed.

SQL>

干杯!!


推荐阅读