【问题标题】:I want to output table based on what the user input我想根据用户输入的内容输出表格
【发布时间】:2019-12-19 03:36:25
【问题描述】:

用户需要输入 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

输出如下所示。

【问题讨论】:

  • 您不能在 SQL 中动态更改 SELECT 列表。如果您使用 PHP 或 Python 等编程语言进行查询,则可以动态构建它。
  • 两张图片之间应该有区别吗?
  • @APC 甲骨文先生
  • @Barmar 我也在想同样的事情。但这正是我老板想要的。 :(
  • @Barmar 不,它们是一样的。不小心重复了。

标签: sql database oracle toad


【解决方案1】:

您的要求有点不清楚。如果您想更改查询的投影,甚至从 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 时过滤的条件。

【讨论】:

  • 这是清晰的目标:例如。 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, 任务和里程碑。
  • 您无法在纯 SQL 中更改投影的结构,但您可以更改是否显示列值。我已经修改了我的答案以反映这一点。
  • 谢谢先生!感谢您的时间和精力。
  • 如果您发现此答案有帮助,请考虑投票和/或接受它。接受的答案提高了本网站对其他寻求者的价值。
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 2019-02-05
  • 2015-06-22
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多