简单检查 SELECT 查询空结果

Posted

技术标签:

【中文标题】简单检查 SELECT 查询空结果【英文标题】:Simple check for SELECT query empty result 【发布时间】:2010-05-21 19:30:23 【问题描述】:

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

例如我有下一个查询:

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

我应该做类似下一步的事情吗:

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

测试结果集是否不为空?

【问题讨论】:

你想做什么?完成检查后您接下来会做什么? 不清楚是否要返回结果集然后检查是否有任何行 int,或者您是否只想检查查询是否返回任何没有结果集的行??跨度> 我想知道,结果集中是否会有任何行。 【参考方案1】:
IF EXISTS(SELECT * FROM service s WHERE s.service_id = ?)
 BEGIN
   --DO STUFF HERE

 END

【讨论】:

将 'SELECT *' 更改为 'SELECT TOP 1 *' 以提高效率 @Ed B:没关系,因为 EXISTS 在第一次成功匹配时返回 true。使用EXISTS (SELECT 1/0 FROM SERVICE... 进行测试 - 它应该返回一个不能被零除的值,但它不会 @Ed B & @OMG Ponies,是的,我认为 SQL Server 足够聪明,可以优化 EXISTS (SELECT *EXISTS (SELECT 1EXISTS (SELECT 1/0 离开 @OMG Ponies, @KM - 我告诉我的开发人员使用 Select 1 的唯一原因是简化搜索以压缩 Select * 的使用。此外,我在 SQL Server 以外的数据库中遇到了效率问题(咳嗽访问咳嗽),因为某些愚蠢的原因,它对 Select 子句做了一些事情。 我可以注意到,当您想要测试它是否为空并且不返回结果集时,这比接受的答案要好,例如如果在存储过程中您还不想返回结果。【参考方案2】:

使用@@ROWCOUNT:

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

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

根据SQL Server Books Online:

返回受影响的行数 最后的声明。如果数 行数超过 20 亿,使用 ROWCOUNT_BIG。

【讨论】:

这很安静,我喜欢。这就是我一直在寻找的。谢谢。 值得注意的是,@@ROWCOUNT 仅在 Transact-SQL 中可用 @MatrixManAtYrService: 是的 - 这个问题 IS 关于使用 T-SQL 的 SQL Server .... 字段值为 NULL 但@@ROWCOUNT 返回 1 !令人困惑:| 当然返回 1!如果有一行被返回,那么该行的列是什么样的并不重要。具有空值的列可能是有价值的信息。【参考方案3】:

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

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

END

HTH

【讨论】:

如果您同意,您应该投票支持该答案。而不是重新发布相同的内容... @OMG Ponies:不一样。他把 * 改成了 1。 嗯,使用 "(SELECT TOP 1 * ..." 会比使用 "SELECT 1..." 更有效 对于IF EXISTS (SELECT * FROM ...IF EXISTS (SELECT 1 FROM ...,我使用SET SHOWPLAN_ALL ON 得到相同的查询计划 相同的结果,因为 RDBMS 隐式优化了次优查询。根据我的口味,这个答案更干净,不依赖于优化。 “幕后”没有做任何事情,也不需要有关查询优化的知识。【参考方案4】:

您可以通过多种方式做到这一点。

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

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

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

【讨论】:

【参考方案5】:

尝试:

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

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

【讨论】:

【参考方案6】:
SELECT COUNT(1) FROM service s WHERE s.service_id = ?

【讨论】:

与count(*)有什么区别? @liang,是的,没有从磁盘读取实际数据,因此速度更快。【参考方案7】:

稍微总结一下以下帖子:

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

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

【讨论】:

【参考方案8】:
SELECT * FROM service s WHERE s.service_id = ?;
IF @@rowcount = 0
begin
select 'no data'
end

【讨论】:

【参考方案9】:

SELECT count(*) as CountThis ....

然后你可以像这样将它作为字符串进行比较:

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

CHECKROW_RS 是一个对象

【讨论】:

【参考方案10】:
SELECT count(*) as count FROM service s WHERE s.service_id = ?;

测试 count == 0 。

更巴洛克式:

选择 case when (SELECT count(*) as count FROM service s WHERE s.service_id = ?) = 0 然后“没有行,兄弟!” else '你有数据!" 以愚蠢的消息结尾;

【讨论】:

【参考方案11】:

在我的sql中使用信息函数

select FOUND_ROWS();

它将返回编号。选择查询返回的行数。

【讨论】:

【参考方案12】:

好吧,有一种方法可以编写更多代码但非常有效

$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"

【讨论】:

以上是关于简单检查 SELECT 查询空结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据库查询返回空结果

简单的查询语句

在 select 中使用 regexp_matches 查询返回空结果集

如何检查游标中的空结果? (烧瓶+ pymysql)

从用户定义的函数中消除空查询结果

如何用SQL语句来判断查询结果为空?