2011-09-07 17 views
41

如果我們在IF EXISTS中有一個SELECT語句,一旦它在表中找到記錄就停止執行?例如:如果在T-SQL中存在的話

IF EXISTS(SELECT * FROM table1 WHERE Name='John') 

return 1 

else 

return 0 

如果在名爲約翰=表中存在的行,不停止執行,並返回1或它橫穿尋找更多的比賽整個表?

+0

僅供參考,您也可以考慮使用,而不是SELECT * SELECT 1,這樣就可以採取指標更好地利用(沒有檢索所有的字段從表中)。 – sfuqua

+14

@sfuqua [這是一個神話](http://bradsruminations.blogspot.com/2009/09/age-old-select-vs-select-1-debate.html) –

+2

IF EXISTS(SELECT 1/0 FROM table1 WHERE Name ='John')...這不會錯誤... SQL從不計算'SELECT'...它只是查看'WHERE'。 –

回答

47

是的,它停止執行,所以這總是優於COUNT > 0往往不會。

如果查看執行計劃,您將看到table1的實際行數不會超過1,而不考慮匹配記錄的數量。

See this article for some discussion on EXISTS vs COUNT

如果合併EXISTS() AND EXISTS()查詢但是你cannot rely on short circuiting。即如果第一個查詢是錯誤的並且因此整個表達式是假的,第二個查詢仍然被執行。

+1

有沒有更好的辦法來做到以下幾點:IF EXISTS(SELECT * FROM T1 WHERE xxx和YYY) RETURN 2 ELSE BEGIN IF EXISTS(SELECT * FROM T1其中xxx) RETURN 1 ELSE 返回0 END我在存儲過程中存儲過程,存儲過程經常執行。我的主要動機是提高性能。我知道我可以在SELECT中使用常數1或0而不是*,但相應的性能改進可以忽略不計 – Sidd

+0

@Sidd - 可能取決於確切查詢的內容和您擁有的索引。你可以改爲'SELECT TOP 1 * FROM t1 WHERE xxx ORDER BY some_condition_that_would_mean_yyyy_would_be_first'然後檢查結果。 –

-3

有在這種情況下沒有必要「其他」:

IF EXISTS(SELECT * FROM table1 WHERE Name='John') return 1 
return 0 
+0

具有返回值的RETURN語句不能在此上下文中使用。 – Aditya