2012-02-07 64 views
1

我试图解决这个问题只有一个选择。它可与2很容易解决,但我只有一个希望:构建检查查询

想象一下这个简单的表:

create table CheckTest(
    name varchar(50) 
) 

我想查询失败(这将是内部的if语句),如果没有表上的所有行或有一排名=“测试”

所以,这些都是可能的方案:

--scenario 1 - no rows: should fail 
truncate table CheckTest 

--scenario2 - rows with value different than "test": should succeed 
insert into CheckTest values ('OK') 
insert into CheckTest values ('OK') 


--scenario3 - 1 row with value "test" or 1 row with value "test" among other rows with value OK 

insert into CheckTest values ('test') 
insert into CheckTest values ('OK') 
insert into CheckTest values ('OK') 

我打算在使用这样的检查:

if (<check>) 
    print 'fail' 
else 
    print 'continue' 
+0

迭戈,你查询应该做什么?根据情况选择“失败”还是“成功”? – 2012-02-07 11:13:06

+0

是的,它是一个proc中的停止条件。我刚刚编辑添加此信息的问题。感谢 – Diego 2012-02-07 11:19:13

回答

2

很可能是这样的:

if (select count(c1.name) + case when count(*) = 0 then 1 else 0 end 
     from #CheckTest c 
     left join #CheckTest c1 on c.name = c1.name and c1.name = 'test') > 0 
    begin 
     select 'fail' 
    end 
    else 
    begin 
     select 'success' 
    end 
+0

的作品,但我想只做一个选择。两者都检查“where”条件。我想知道是否可以检查一个条件,并且同时存在一条线。 – Diego 2012-02-07 11:29:29

+0

@Diego,这是可能的,检查我编辑的答案。 – 2012-02-07 11:40:42

1

这是可能的,但我不会理会。

我能想到的将所有这些方法合并为一个SELECT(例如使用COUNTDENSE_RANK)的方法效率低于两个单独的查询。下面的一种方法。

IF NOT EXISTS(SELECT * 
       FROM CheckTest 
       HAVING SUM(DISTINCT CASE 
            WHEN name = 'test' THEN 1 
            ELSE 2 
            END) = 2) 
    PRINT 'fail' 
ELSE 
    PRINT 'continue'