0

私のアプリケーションでは、テーブル名は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て取得する必要があるため、ここに require があります。dataset_idproject_id

すべて問題ありませんdataset_id、 10 以上 10 の場合、適切な最大値を取得できません。つまり、 9を取得するたびに意味します。

本当の問題が何であるかはわかりません。クエリを実行するだけですが、適切な回答が得られません。

4

2 に答える 2

0

テキストフィールドの場合、「9」は「10」よりも大きくなります。id フィールドでは、適切な比較を行うために整数を使用する必要があります。

次に、次のような方法で取得できます。

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

sqlite テーブルを作成するときは、TEXT ではなく INTEGER 列を使用してください。さらに良いことに、列 INTEGER PRIMARY KEY を定義すると、テーブルの行 ID が返されます。詳しくは、ROWID と INTEGER PIMARY KEYS の見出しの下で読むことができます。これは行 ID のエイリアスであるため、データを挿入するときに値を割り当てる必要はありません。次に高い ID が取得されます。

この列を一意の ID にしたくない場合は、単に列を整数として定義し、挿入時に値を指定します。

最後に、最大 ID を取得しようとしている場合は、挿入後にsqlite3_last_insert_rowidを使用することを検討してください。行 ID から最後の 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" , [参照: 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 に答える