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

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

例如我有下一个查询:

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

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

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

测试结果集是否不为空?

【问题讨论】:

  • 你想做什么?完成检查后您接下来会做什么?
  • 不清楚是否要返回结果集然后检查是否有任何行 int,或者您是否只想检查查询是否返回任何没有结果集的行??跨度>
  • 我想知道,结果集中是否会有任何行。

标签: sql sql-server database


【解决方案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"
                }

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多