簡體   English   中英

為什么列的最大值永遠不等於或大於10?

[英]Why is the maximum value of a column never equal to or greater than 10?

在我的應用程序中,表名稱為dataset_master 並且Table的字段名稱為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是必需的,因為我需要基於project_id獲取dataset_id

一切都很好,但是當dataset_id10或 dataset_id 10時,我將無法獲得適當的最大值,我的意思是每次獲得9時

我不知道什么是真正的問題,我只執行簡單的查詢,但無法獲得正確的答案。

如果是文本字段,則“ 9”將大於“ 10”。 對於id字段,您應該使用整數以獲得良好的比較。

然后,您可以使用以下內容檢索它:

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

創建sqlite表時 ,請使用INTEGER列,而不要使用TEXT。 更好的是,您可以定義INTEGER PRIMARY KEY列,它將返回表的rowid。 可以在ROWID和INTEGER PIMARY KEYS標題下閱讀更多內容。 由於它是rowid的別名,因此在插入數據時無需分配值-它會獲得下一個最高ID。

如果您不希望此列是唯一的ID,則只需將該列定義為整數並在插入時提供一個值。

最后,如果您要獲取最大ID,請考慮在插入后使用sqlite3_last_insert_rowid 它將返回rowid中的最后一個id。

使用以下查詢,但是請注意,這是一個昂貴的調用:

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]中的位置,因此,如果存儲的數據為“ 9”,“ 10”。

另一方面,

如果存儲的數據是“ 09”,“ 10”,並且您的查詢是:

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

您將得到的結果是“ 10”。

  • 我的答案長期有效嗎?

如果您沒有太多數據,它將起作用,否則它將使您變慢,因此,我將其提及為:在原始SELECT查詢中調用CAST函數非常昂貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM