2015-02-05 36 views
0

为什么下面的代码在使用max函数时给了我不同的结果?我认为在这种情况下它也应该返回SQLITE_DONESQLite,SELECT和max函数

#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 
    } 
} 

在此先感谢。

回答

0

当您使用GROUP BY时,您将为分组列的每个唯一值获取一个组。 如果不存在任何要分组的行,则不存在组,并且查询不返回任何行。

当您使用不带GROUP BY的max()等聚合函数时,整个表将成为一个组。 即使表格为空,也会发生这种情况,即您会得到一个聚合在空集上的单个组。

如果在不存在bar = 1行时不想得到结果,请添加GROUP BY bar