简单检查SELECT查询是否为空结果


71

谁能指出如何检查选择查询是否返回非空结果集?

例如,我有下一个查询:

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

我应该像下面那样做吗:

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

测试结果集是否不为空?


你想做什么?做完支票后,下一步该怎么做?
Mark Byers

目前尚不清楚是否要返回结果集,然后检查是否有整行,或者是否只想查询查询是否返回没有结果集的任何行?
KM。

1
我想知道结果集中是否有任何行。
Denys S.

Answers:


93

使用@@ ROWCOUNT:

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

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

根据SQL Server联机丛书

返回受最后一条语句影响的行数。如果行数超过20亿,请使用ROWCOUNT_BIG。


7
我喜欢这很安静。这就是我想要的。谢谢。
Denys S.

值得注意的是,@@ ROWCOUNT仅在Transact-SQL中可用
MatrixManAtYrService 2015年

1
@MatrixManAtYrService:是的-这个问题IS有关SQL Server,它使用T-SQL ....
marc_s

字段值为NULL,但@@ ROWCOUNT返回1!令人困惑:|
QMaster

当然它返回1!如果返回一行,则该行的列是什么样子都没有关系。具有空值的列可能是有价值的信息。
Schnaps

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

 END

4
将“ SELECT *”更改为“ SELECT TOP 1 *”以提高效率
Ed B 2010年

18
@Ed B:没关系,因为EXISTS在第一个成功的比赛中返回true。测试使用EXISTS (SELECT 1/0 FROM SERVICE...-它应该返回一个不能除以零,但它不会
OMG小马

1
@Ed B&@OMG小马,是啊,我认为SQL Server是足够聪明,优化EXISTS (SELECT *EXISTS (SELECT 1EXISTS (SELECT 1/0离开
KM。

1
@OMG小马,@ KM-我告诉开发人员使用Select 1的唯一原因是简化搜索,以简化Select *的使用。另外,我遇​​到了除SQL Server(咳嗽访问咳嗽)以外的数据库中的效率问题,出于某种愚蠢的原因,它在Select子句中做了一些事情。
汤玛斯(Thomas)2010年

1
我注意到,这比接受的答案更好,当你只是想测试,如果它是空的,而不是返回结果集,比如如果在一个存储过程,你不想返回结果呢。
Mike M

11

我同意EdB。您应该使用EXISTS方法,但是更有效的方法是:

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

END

高温超导


15
如果您同意,则应对该答案进行投票。而不是重新发布相同的内容...
OMG Ponies,2010年

1
@OMG小马:不一样。他改变了*为1
马克·拜尔斯

1
好吧,使用“(SELECT TOP 1 * ...”将比使用“ SELECT 1 ...”更有效
Ed B 2010年

5
我使用SET SHOWPLAN_ALL ONforIF EXISTS (SELECT * FROM ...IF EXISTS (SELECT 1 FROM ...
KM

10

您可以通过多种方式进行操作。

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

7

尝试:

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

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



1

总结一下以下内容:

如果您只关心数据库中是否至少有一个匹配的行,则使用exists它,因为它是检查此问题的最有效方法:一旦找​​到至少一个匹配的行count,它将立即返回true,而等会找到所有匹配的行行。

如果您确实需要使用数据进行处理,或者查询有副作用,或者您需要知道实际的总行数,则检查ROWCOUNTorcount可能是最好的方法。


1

SELECT count(*) as CountThis ....

然后,您可以将其作为字符串进行比较,如下所示:

IF CHECKROW_RS("CountThis")="0" THEN ...

CHECKROW_RS 是一个对象


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

测试count == 0。

更巴洛克地:

当(SELECT count(*)as FROM service s WHERE s.service_id =?)的计数为0时选择情况,然后'无行,兄弟!否则,“您有数据!”以stupid_message结尾;



0

好吧,有一种方法可以做更多的代码,但是真的很有效

$sql = "SELECT * FROM messages";  //your query
$result=$connvar->query($sql);    //$connvar is the connection variable
$flag=0;
     while($rows2=mysqli_fetch_assoc($result2))
    { $flag++;}
    
if($flag==0){no rows selected;}
else{
echo $flag." "."rows are selected"
}


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.