简单检查 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 1
或 EXISTS (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_COUNT
like
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
等会找到所有匹配的行。
如果您确实需要使用数据进行处理或者查询有副作用,或者如果您需要知道实际的总行数,那么检查ROWCOUNT
或count
可能是最好的方法.
【讨论】:
【参考方案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 查询空结果的主要内容,如果未能解决你的问题,请参考以下文章