首页 > 解决方案 > 我想根据用户输入的内容输出表格

问题描述

用户需要输入 APP_ID,但可选择输入 MILESTONE_ID 和 TASK_ID。如果 MILESTONE_ID 只是输入,那应该是里程碑才不包括任务。

前任。APP_ID: 1 MILESTONE_ID:341 TASK_ID: (空白) = 输出应该是 app_id 和里程碑。

当 APP_ID: 1 MILESTONE_ID: (空白) TASK_ID: 441 = 输出应该只是 app_id 和任务。

最后当用户输入一个 APP_ID: 1, MILESTONE_ID:341, TASK_ID: 441 = 输出应该是 app_id, 任务和里程碑。

我当前的查询如下:

SELECT APPLICATION, MILESTONE_NAME, TASK_NAME, FIELD_NAME, FIELD_ALIAS 
FROM TBL_APPLICATIONS A
    INNER JOIN TBL_WORKFLOWS B ON B.APPLICATION_FK = A.APPLICATION_PK
    INNER JOIN TBL_WORKFLOW_DEFINITION C ON C.WORKFLOW_FK = B.WORKFLOW_PK
    INNER JOIN TBL_MILESTONE D ON D.MILESTONE_PK = C.START_MILESTONE_FK  OR D.MILESTONE_PK =  C.END_MILESTONE_FK 
    INNER JOIN TBL_TASK_FOR_MILESTONE E  ON E.MILESTONE_FK =  D.MILESTONE_PK 
    INNER JOIN TBL_TASK F ON F.TASK_PK  =  E.TASK_FK strong text
    INNER JOIN TBL_REQ_FOR_TASK G ON  G.TASK_FK  = F.TASK_PK 
    INNER JOIN TBL_TASK_REQUIREMENTS H ON H.TASK_REQUIREMENT_PK = G.TASK_REQUIREMENT_FK 
WHERE  APPLICATION_PK = :APPLICATION_ID 
OR MILESTONE_PK = :MILESTONE_ID 
OR  TASK_PK = :TASK_ID

输出看起来像这样。

我被困住了

标签: sqldatabaseoracletoad

解决方案


你的要求有点不清楚。如果您想更改查询的投影,甚至从 FROM 子句中删除表,这在纯 SQL 中是做不到的。动态组装查询需要 PL/SQL 或其他一些客户端语言。

但是,如果您的要求只是有条件地抑制列值是否填充参数,则可以通过测试每个参数来完成,如下所示:

SELECT APPLICATION
      , case when :MILESTONE_ID is not null then MILESTONE_NAME end as MILESTONE_NAME
      , case when :TASK_ID is not null then TASK_NAME end as TASK_NAME
      , FIELD_NAME
      , FIELD_ALIAS 
FROM TBL_APPLICATIONS A
    INNER JOIN TBL_WORKFLOWS B ON B.APPLICATION_FK = A.APPLICATION_PK
    INNER JOIN TBL_WORKFLOW_DEFINITION C ON C.WORKFLOW_FK = B.WORKFLOW_PK
    INNER JOIN TBL_MILESTONE D ON D.MILESTONE_PK = C.START_MILESTONE_FK  OR D.MILESTONE_PK =  C.END_MILESTONE_FK 
    INNER JOIN TBL_TASK_FOR_MILESTONE E  ON E.MILESTONE_FK =  D.MILESTONE_PK 
    INNER JOIN TBL_TASK F ON F.TASK_PK  =  E.TASK_FK strong text
    INNER JOIN TBL_REQ_FOR_TASK G ON  G.TASK_FK  = F.TASK_PK 
    INNER JOIN TBL_TASK_REQUIREMENTS H ON H.TASK_REQUIREMENT_PK = G.TASK_REQUIREMENT_FK 
WHERE  APPLICATION_PK = :APPLICATION_ID 
and ( :MILESTONE_ID  is not null or :TASK_ID is not null )
and ( :MILESTONE_ID  is null or MILESTONE_PK = :MILESTONE_ID )
and ( :TASK_ID       is null or  TASK_PK = : )

请注意,我已更正 WHERE 子句以包含仅在填充 MILESTONE_ID 或 TASK_ID 时过滤的条件。


推荐阅读