【问题标题】:Perform second part of query only if first part returns nothing仅当第一部分不返回任何内容时才执行查询的第二部分
【发布时间】:2014-08-05 16:45:20
【问题描述】:

这是我的查询。

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 不是答案,因为这包括两个结果,我只是将其用作填充物,它将被删除)。

【问题讨论】:

  • 您可以添加额外的检查以获取 AND (SELECT COUNT(*) FROM jobs where status='BUILDING' and Type='SLA') > 0

标签: sql sql-server


【解决方案1】:
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

更新

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

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')

【讨论】:

  • IF EXISTS 只满足他的第一个条件,并且无论如何都会返回两行 - 他只想要顶行
  • @AHiggins if select * from jobs where status='BUILDING' and Type='SLA' has null 结果集,然后他想阻止查询执行我认为...
  • “同样,第二个查询只有在第一个查询返回 NULL 时才应该运行”......他试图根据第一个查询是否有值来切换运行哪个查询,如果first 有值。
  • 萨曼,如果在单个查询中多次存在,我该如何使用?我可以使用 AND 关键字来执行此操作吗?
  • 像这样:if exists(select * from Table1) and exists(select * from Table2)
【解决方案2】:

感谢萨曼的帮助。你的 IF EXISTS 一开始就帮助了我。这个查询为我解决了这个问题。只需添加一个简单的 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多