2012-02-07 109 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'