Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我想根据用户输入的内容输出表_Sql_Database_Oracle_Toad - Fatal编程技术网

Sql 我想根据用户输入的内容输出表

Sql 我想根据用户输入的内容输出表,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,但可选择输入里程碑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_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中更改投影的结构,但可以更改是否显示列值。我已经修改了我的答案以反映这一点。谢谢您,先生!谢谢如果你发现这个答案是有用的,请考虑投票和/或接受它。接受的答案提高了这个网站的价值为其他求职者。