为什么列的最大值永远不等于或大于10?

时间:2013-07-23 11:48:00

标签: iphone ios objective-c sqlite

在我的应用程序中,我的表名是 dataset_master 。 并且表的字段名称为 dataset_id ,我希望获得此字段的最大值,这样我就可以使用代码查询查询。

-(NSString *) getLastRowFromDataset_masterTableByProjectID:(NSString *) project_id
{
    NSString *dataset_id = @"";
    sqlite3_stmt *statement = NULL;
    NSString *query = [NSString stringWithFormat:@"SELECT MAX(dataset_id) FROM dataset_master where project_id = ?;"];

    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        sqlite3_bind_text(statement, 1, [project_id UTF8String], -1, SQLITE_TRANSIENT);

        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            char *datasetIDChars = (char *) sqlite3_column_text(statement, 0);

            if(datasetIDChars != NULL)
                dataset_id  = [[NSString alloc] initWithUTF8String:datasetIDChars];

        }
    }

    return dataset_id;
}

此处project_id需要我,因为我需要dataset_id基于project_id

一切都很顺利,但当dataset_id 10或者超过10 时,我无法获得正确的最大值,我的意思是每次我 9

我不知道什么是真正的问题我简单的火查询但我无法得到正确的答案。

2 个答案:

答案 0 :(得分:0)

如果是文本字段,则“9”将大于“10”。对于id字段,您应该使用整数来进行良好的比较。

然后您可以使用以下内容检索它:

NSNumber *id = [NSNumber numberWithLongLong:sqlite_column_int64(statement, i)];

当你create the sqlite table时,使用INTEGER列而不是TEXT。更好的是,您可以定义列INTEGER PRIMARY KEY,它将返回表的rowid。可以阅读更多内容here under ROWIDs and INTEGER PIMARY KEYS heading。由于它是rowid的别名,因此在插入数据时不需要指定值 - 它将获得下一个最高ID。

如果您不希望此列成为唯一ID,则只需将该列定义为整数并在插入时提供值。

最后,如果您尝试获取最大ID,请在插入后考虑使用sqlite3_last_insert_rowid。它将返回rowid中的最后一个id。

答案 1 :(得分:0)

使用以下查询,但请注意这有点代价高昂致电:

NSString *query = [NSString stringWithFormat:@"SELECT MAX(CAST(dataset_id AS INTEGER)) FROM dataset_master where project_id = ?;"];

否则

将dataset_id的数据类型更改为整数可以解决您的问题。

Ranju Patel的查询:

  • 为什么MAX函数不能与TEXT数据类型一起使用?

对于TEXT数据类型,排序顺序为ASCII排序顺序,

其中“9”> “10”“09”< “10”,[参考:http://en.wikipedia.org/wiki/ASCII#Order],因此如果存储的数据是“9”,“10”,MAX功能将不起作用。

另一方面,

如果提交的数据是“09”,“10”,您的查询是:

NSString *query = [NSString stringWithFormat:@"SELECT MAX(dataset_id) FROM dataset_master where project_id = ?;"];

你得到的结果是“10”。

  • 我的回答会长时间有效吗?

如果您没有太多数据,它会起作用,否则会降低您的速度,因此我提到它:在原始SELECT查询中调用 CAST 函数非常昂贵。