Sql 我想根据用户输入的内容输出表
用户需要输入应用程序ID,但可选择输入里程碑ID和任务ID。如果里程碑ID仅包含输入,则应为里程碑ID,不包含任务 例如,应用程序ID:1里程碑ID:341任务ID:(空白)=输出应仅为应用程序ID和里程碑 当APP_ID:1里程碑_ID:(空白)TASK_ID:441=输出应为APP_ID且仅为TASKSql 我想根据用户输入的内容输出表,sql,database,oracle,toad,Sql,Database,Oracle,Toad,用户需要输入应用程序ID,但可选择输入里程碑ID和任务ID。如果里程碑ID仅包含输入,则应为里程碑ID,不包含任务 例如,应用程序ID:1里程碑ID:341任务ID:(空白)=输出应仅为应用程序ID和里程碑 当APP_ID:1里程碑_ID:(空白)TASK_ID:441=输出应为APP_ID且仅为TASK 最后,当用户输入应用程序ID:1、里程碑ID:341、任务ID:441=输出应为应用程序ID、任务和里程碑 我目前的查询如下: SELECT APPLICATION, MILESTONE_NA
最后,当用户输入应用程序ID:1、里程碑ID:341、任务ID:441=输出应为应用程序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子句,使其包含在填充里程碑ID或任务ID时仅对其进行过滤的条件 您不能在SQL中动态更改
SELECT
列表。如果您使用PHP或Python等编程语言进行查询,则可以动态构建它。这两个图像之间应该有区别吗?@APC-Oraclesir@Barmar我也这么想。但这正是我老板想要的(@Barmar No.它们是相同的。意外重复。这是清晰的目标:例如,应用程序ID:1里程碑ID:341任务ID:(空白)=输出应仅为应用程序ID和里程碑。当应用程序ID:1里程碑ID:(空白)TASK\u ID:441=输出应该是app\u ID和TASK only。最后,当用户输入app\u ID:1,MILESTONE\u ID:341时,TASK\u ID:441=输出应该是app\u ID,TASK和MILESTONE。您不能在纯SQL中更改投影的结构,但可以更改是否显示列值。我已经修改了我的答案以反映这一点。谢谢您,先生!谢谢如果你发现这个答案是有用的,请考虑投票和/或接受它。接受的答案提高了这个网站的价值为其他求职者。