2015-02-05 111 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