如何有效地检查表是不是为空?

Posted

技术标签:

【中文标题】如何有效地检查表是不是为空?【英文标题】:How to efficiently check if a table is empty?如何有效地检查表是否为空? 【发布时间】:2013-06-24 20:39:50 【问题描述】:

在我目前正在编写的程序中,我需要检查一个表是否为空。我目前只有一个基本的 SQL 执行语句,即

Count(asterisk) from Table

然后我有一个 fetch 方法来抓取这一行,将 Count(asterisk) 放入一个参数中,以便我可以检查它(如果 count(*) count(asterisk) 将返回大约 11,000 行。这样的事情会更有效率吗?

 select count(*) 
 from (select top 1 * 
        from TABLE)

但我无法让它在 Microsoft SQL Server 中工作

这将返回 1 或 0,我可以在执行语句时在我的编程语言中对此进行检查,并获取 count 参数以查看 TABLE 是否为空。

欢迎任何 cmets、想法或疑虑。

【问题讨论】:

您永远不必问“这会不会更有效” - SQL Server 为您提供了大量工具来评估查询性能(执行计划、DMV 和 DMO、分析器跟踪等),例如你可以从你自己的环境中得到一个明确的答案。使用代表您的生产环境的数据,尝试几种查询方式并选择产生最佳结果的一种。 刚接触 Microsoft SQL Server,不熟悉这些工具。我会更多地研究你提到的工具。感谢您的帮助。 【参考方案1】:

您正在寻找表是否为空的指示。因为那个 SQL 有 EXISTS 关键字。 如果您在存储过程中执行此操作,请使用以下模式:

IF(NOT EXISTS(SELECT 1 FROM dbo.MyTable))
BEGIN
  RAISERROR('MyError',16,10);
END;

如果您让指标返回以在应用内采取相应行动,请使用以下模式:

SELECT CASE WHEN EXISTS(SELECT 1 FROM dbo.MyTable) THEN 0 ELSE 1 END AS IsEmpty;

虽然大多数其他响应也会产生预期的结果,但它们似乎掩盖了意图。

【讨论】:

NOT Exists ... 周围的括号 - () - 不是强制性的。这是检查表中是否存在行的正确工具。 @Stoleg,你说得对,() 不是强制性的。这只是我采用的一种模式,总是将IF 条件包装到() 中,因为大多数其他语言都需要它。【参考方案2】:

你可以试试这样的:

select count(1) where exists (select * from t)

在SQLFiddle上测试

【讨论】:

+1 。 . .我碰巧喜欢这种方法,因为它是标准 SQL。 @Stoleg 因为要求选择 1 或 0,如果表为空,select 1 将不返回任何行。 @mustaccio 我很抱歉!确实如此!【参考方案3】:

我想写关于 EXISTS 的文章,但 Sebastian Meine 写得更快。虽然我更喜欢使用EXISTS,但还有一种方法。

SELECT rows 
FROM sys.partitions 
WHERE object_id = object_id('MyTableName') 
    AND partition_number = 1

【讨论】:

【参考方案4】:

请在检查是否存在时使用前 1,因为没有它,您将拥有与记录数一样多的“一”:

IF NOT EXISTS(select top 1 1 from Table)
BEGIN
  RAISERROR('Error',0,1);
END;

【讨论】:

【参考方案5】:

这似乎是一种奇怪的方式来获得你想要的东西。你能改用HAVING吗?

SELECT id, name FROM TABLE
GROUP BY id, name
HAVING COUNT(*) > 0

【讨论】:

【参考方案6】:

你的变化很好。您只需要子查询上的别名:

 select count(*) 
 from (select top 1 * 
        from TABLE
      ) t

【讨论】:

谢谢戈登。我通常在 MS Access 中编写查询,但不知道我必须在子查询上创建别名,所以这非常有帮助。【参考方案7】:

IF EXISTS 可用于检查表是否为空。

IF EXISTS (select * from YourTable)
SELECT 'Table is not empty'
ELSE
SELECT 'Table is empty'

【讨论】:

以上是关于如何有效地检查表是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 count(*) 检查表是不是为空

带有 Sqlite 的 Android - 如何检查表是不是存在以及是不是为空

两个表连接时如何检查字段是不是为空

如何检查数字输入是不是为空?

NodeJS - 如何检查 MySQL 结果是不是未定义/为空?

如何在jooq查询的左连接中检查记录是不是完​​全为空