sql - 我想根据用户输入的内容输出表格
问题描述
用户需要输入 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
输出看起来像这样。
解决方案
你的要求有点不清楚。如果您想更改查询的投影,甚至从 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 时过滤的条件。
推荐阅读
- javascript - 减去 int 给出与加法不同的结果
- c - 如何将随机生成的整数分配给 C 中的字符串?
- bash - Ansible facter - 在 bash 脚本中不显示 facter
- c++ - C++链表反向遍历内存损坏
- java - 为 Java 设置 Selenium(创建 Firefox 驱动程序所需的 jar 和导入)
- php - 在自定义模板(访问者的课程页面)上打印课程中的课程列表 learndash get_course_lessons()
- python - CSV 列作为单个列表而不是分隔字符串
- scala - 将 RDD[String] 转换为 RDD[myclass]
- python - 石头剪刀布循环问题 Python
- python - 如何修复我的 if 语句不基于随机数生成器重复