0

在我的应用程序中,我的表名是dataset_master。并且表的字段名称是dataset_id,我想获得这个字段的最大值,所以很简单,我用代码在 Query 之后触发。

-(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_id10或更多然后 10然后我无法获得正确的最大值,我的意思是每次我得到9

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

4

2 回答 2

0

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

然后你可以用类似的东西来检索它:

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

创建sqlite 表时,请使用 INTEGER 列而不是 TEXT。更好的是,您可以定义 INTEGER PRIMARY KEY 列,它将返回表的 rowid。可以阅读更多在 ROWIDs 和 INTEGER PIMARY KEYS 标题下阅读。由于它是 rowid 的别名,因此在插入数据时不需要指定值 - 它会获得下一个最高的 id。

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

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

于 2013-07-23T11:55:45.953 回答
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" , [Ref: http://en.wikipedia.org/wiki/ASCII#Order], 因此如果存储的数据是 MAX 函数将不起作用“9”,“10”。

另一方面,

如果排序的数据是“09”、“10”,并且您的查询是:

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

你会得到的结果是“10”。

  • 我的回答会长期有效吗?

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

于 2013-07-23T12:27:56.073 回答