Sql 仅当第一部分不返回任何内容时,才执行查询的第二部分

Sql 仅当第一部分不返回任何内容时,才执行查询的第二部分,sql,sql-server,Sql,Sql Server,这是我的问题 select * from jobs where status='BUILDING' and Type='SLA' UNION ALL select top 1 * from jobs where Scheduled_Time = (select min(Scheduled_Time) from Jobs where status='IDLE' and type='SLA') 我是MSSQL新手,我想知道如何才能让这个查询工作,这样,如果UNION ALL之前的第一个查询没有

这是我的问题

select * from jobs where status='BUILDING' and Type='SLA' UNION ALL 
select top 1 * from jobs where Scheduled_Time = (select min(Scheduled_Time) from Jobs 
where status='IDLE' and type='SLA')

我是MSSQL新手,我想知道如何才能让这个查询工作,这样,如果UNION ALL之前的第一个查询没有返回null,那么第二个查询将不会运行?同样,只有当第一个查询返回null时,才应该运行第二个查询。显然,UNION ALL并不是答案,因为这包括了两个结果,我只是用它作为填充,它将被删除

IF EXISTS (select * from jobs where status='BUILDING' and Type='SLA')
BEGIN
select * from jobs where status='BUILDING' and Type='SLA' UNION ALL 
select top 1 * from jobs where Scheduled_Time = (select min(Scheduled_Time) from Jobs 
where status='IDLE' and type='SLA')
END
也许这个查询有性能问题,但它的工作原理和您所说的一样。 为了避免性能不佳,您可以将查询更改为:

DECLARE @result1 TABLE (a INT, Type varchar, status varchar)

INSERT INTO @result1
select * from jobs where status='BUILDING' and Type='SLA'

 IF EXISTS (select * from @result1)
    BEGIN
    select * from @result1 UNION ALL 
    select top 1 * from jobs where Scheduled_Time = (select min(Scheduled_Time) from Jobs 
    where status='IDLE' and type='SLA')
    END
更新

这是您在评论中所说的正确查询:

IF EXISTS (select * from jobs where status='BUILDING' and Type='SLA')
 BEGIN
 select * from jobs where status='BUILDING' and Type='SLA' 
END 
ELSE
 select top 1 * from jobs where Scheduled_Time = (select min(Scheduled_Time) from Jobs where status='IDLE' and type='SLA')

我感谢你的帮助,萨曼。你的存在从一开始就帮助了我。这个问题为我解决了。只需要添加一个简单的else语句

IF EXISTS (select * from jobs where status='BUILDING' and Type='SLA') BEGIN select 
* from jobs where status='BUILDING' and Type='SLA' END ELSE select top 1 * from jobs 
where Scheduled_Time = (select min(Scheduled_Time) from Jobs where status='IDLE' and 
type='SLA')

您可以添加一个额外的检查来获取该值,并从作业中选择COUNT*,其中status='BUILDING'和Type='SLA'>0如果EXISTS仅满足其第一个条件,并且在任何情况下都将返回这两行-他只需要顶部row@AHiggins如果从状态为class='BUILDING'和类型为class='SLA'的作业中选择*,然后他想阻止查询执行,我想…同样,只有当第一个查询返回NULL时,第二个查询才应该运行。。。他试图根据第一个查询是否有值来切换运行哪个查询,而不是在第一个查询有值时同时运行两个查询。Saman,我如何在一个查询中多次使用if?我可以使用AND关键字来执行此操作吗?如下所示:如果existsselect*来自表1,existsselect*来自表2