SQLite, SELECT and max function

SQLite, SELECT and max function

本文关键字:max function and SELECT SQLite      更新时间:2023-10-16

为什么以下代码在使用max函数时会给我不同的结果?我认为在这种情况下它也应该返回SQLITE_DONE

#include <boost/scope_exit.hpp>
#include <sqlite3.h>
#include <cstdlib>
#include <iostream>
int main()
{
  sqlite3* db;
  int rc = sqlite3_open(":memory:", &db);
  BOOST_SCOPE_EXIT_ALL(&db)
  {
    sqlite3_close(db);
  };
  if (rc != SQLITE_OK)
  {
    std::cerr << "Can't open database."
      << " Error code: " << rc
      << " Error description: " << sqlite3_errmsg(db);
    return EXIT_FAILURE;
  }
  char* errMsg;
  rc = sqlite3_exec(db, "CREATE TABLE foo (bar INTEGER)", NULL, NULL, &errMsg);
  if (rc != SQLITE_OK)
  {
    std::cerr << "Can't create "foo" table."
      << " Error code: " << rc
      << " Error description: " << errMsg;
    sqlite3_free(errMsg);
    return EXIT_FAILURE;
  }
  {
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare_v2(db, "SELECT bar FROM foo WHERE bar = 1", -1, &stmt, NULL);
    if (rc != SQLITE_OK)
    {
      std::cerr << "Can't prepare SELECT statement."
        << " Error code: " << rc
        << " Error description: " << sqlite3_errmsg(db);
      return EXIT_FAILURE;
    }
    BOOST_SCOPE_EXIT_ALL(&stmt)
    {
      sqlite3_finalize(stmt);
    };
    rc = sqlite3_step(stmt);
    std::cout << rc << std::endl; // 101 -- SQLITE_DONE
  }
  {
    sqlite3_stmt* stmt;
    rc = sqlite3_prepare_v2(db, "SELECT max(bar) FROM foo WHERE bar = 1", -1, &stmt, NULL);
    if (rc != SQLITE_OK)
    {
      std::cerr << "Can't prepare SELECT statement."
        << " Error code: " << rc
        << " Error description: " << sqlite3_errmsg(db);
      return EXIT_FAILURE;
    }
    BOOST_SCOPE_EXIT_ALL(&stmt)
    {
      sqlite3_finalize(stmt);
    };
    rc = sqlite3_step(stmt);
    std::cout << rc << std::endl; // 100 -- SQLITE_ROW
  }
}

提前谢谢。

使用GROUP BY时,分组列的每个唯一值都会得到一个组。如果不存在任何要分组的行,则不存在任何组,并且查询不返回任何行。

当使用不带GROUP BY的max()之类的聚合函数时,整个表将变成一个组。即使表是空的,也会发生这种情况,也就是说,您得到了一个在空集上聚合的组。

如果不希望在没有bar = 1行的情况下得到结果,请添加GROUP BY bar