2010-05-21 131 views
37

任何人都可以指出如何檢查選擇查詢是否返回非空結果集?簡單檢查SELECT查詢空結果

比如我有一個查詢:

SELECT * FROM service s WHERE s.service_id = ?; 

我應該這樣做下一篇:

ISNULL(SELECT * FROM service s WHERE s.service_id = ?) 

測試如果結果集是不是空的?

+0

你到底想幹什麼?在做檢查後你會做什麼? – 2010-05-21 19:42:23

+0

不清楚你是否想返回一個結果集,然後檢查是否有行是int,或者你只是想檢查一個查詢是否返回沒有結果集的行? – 2010-05-21 19:53:29

+1

我想知道,如果結果集中有任何行。 – 2010-05-21 20:32:01

回答

55

使用@ @ROWCOUNT:

SELECT * FROM service s WHERE s.service_id = ?; 

IF @@ROWCOUNT > 0 
    -- do stuff here..... 

根據SQL Server Books Online

返回最後一條語句受 影響的行數。如果 行的數量超過20億,請使用 ROWCOUNT_BIG。

+6

這是安靜直接的,我喜歡它。這就是我所期待的。謝謝。 – 2010-05-21 20:37:36

+0

值得注意的是,@@ ROWCOUNT僅在Transact-SQL中可用 – MatrixManAtYrService 2015-09-21 19:35:06

+1

@MatrixManAtYrService:是 - 此問題** IS **關於使用T-SQL的SQL Server .... – 2015-09-21 20:19:26

75
IF EXISTS(SELECT * FROM service s WHERE s.service_id = ?) 
BEGIN 
    --DO STUFF HERE 

END 
+3

爲了提高效率,將'SELECT *'更改爲'SELECT TOP 1 *' – 2010-05-21 19:49:18

+13

@Ed B:這並不重要,因爲EXISTS在第一次成功匹配時返回true。使用'EXISTS(SELECT 1/0 FROM SERVICE ...')進行測試 - 它應該返回一個不能被0除的分支,但它不會被 – 2010-05-21 20:04:39

+1

@Ed B&@OMG Ponies,是的,我認爲SQL Server足夠智能優化'EXISTS(SELECT *'或'EXISTS(SELECT 1'或'EXISTS(SELECT 1/0') – 2010-05-21 20:08:50

0
SELECT count(*) as count FROM service s WHERE s.service_id = ?; 

如果測試計數== 0。

更多baroquely:

選擇情況下(?SELECT COUNT(*)作爲計數從服務中S其中s.service_id =)= 0 然後 '!沒有行,兄弟'否則「你有數據「結束的stupid_message;

7

我跟埃德B.同意你應該使用EXISTS方法,但更有效的方式來做到這一點是:

IF EXISTS(SELECT 1 FROM service s WHERE s.service_id = ?) 
BEGIN 
    --DO STUFF HERE 

END 

HTH

+12

If你同意,你應該投票支持這個答案,而不是重新發布相同的內容... – 2010-05-21 19:38:27

+1

@OMG小馬:它是不一樣的,他把*改成了1. – 2010-05-21 19:44:11

+1

那麼,使用「(SELECT TOP 1 * ...」比使用「SELECT 1 ...」更有效率 – 2010-05-21 19:48:06

5

嘗試:

SELECT * FROM service s WHERE s.service_id = ?; 

IF @@ROWCOUNT=0 
BEGIN 
    PRINT 'no rows!' 
END 
1

總結文章下方的一點:

如果所有你關心的是,如果至少一個匹配行是在數據庫中,然後使用exists,因爲它是最有效的方法來檢查它:只要找到至少一個匹配的行,它就會返回true,而count等將找到所有匹配的行。

如果您確實需要使用數據進行處理,或者查詢有副作用,或者您需要知道實際的總行數,那麼檢查ROWCOUNTcount可能是最好的方法。

2
SELECT COUNT(1) FROM service s WHERE s.service_id = ? 
+2

與count(*)的區別是什麼? – liang 2013-05-10 00:50:01

0
SELECT * FROM service s WHERE s.service_id = ?; 
IF @@rowcount = 0 
begin 
select 'no data' 
end 
0

在我的SQL使用信息功能

select FOUND_ROWS(); 

它將返回無。通過select查詢返回的行。

3

您可以通過多種方式來完成。

IF EXISTS(select * from ....) 
begin 
-- select * from .... 
end 
else 
-- do something 

或者你可以使用IF NOT EXISTS , @@ROW_COUNT

select * from .... 
IF(@@ROW_COUNT>0) 
begin 
-- do something 
end