2010-05-21 136 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