Android ドキュメントにあるように、rawQuery メソッドの selectionArgs パラメータは文字列として解析されます。
SQLiteDatabase.rawQuery(String sql, String[] selectionArgs)
selectionArgs: クエリの where 句に ?s を含めることができます。これは、selectionArgs の値に置き換えられます。値は文字列としてバインドされます。
しかし今日、私は 1 日の大部分を占める問題に直面しました。次のクエリを想像してください。
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= 15
COLUMN_A は INTEGER です。テーブルには、その基準に対応する約 10 行があります。データベース エディターでクエリを実行すると、常に正しい結果が得られましたが、スマートフォンでは、ステートメントは常に行を返しませんでした。
しばらくして、クエリを次のように変更しました。
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= '15'
エディターは Android と同じように行を返しませんでした。したがって、クエリを次のように変更します。
SELECT * FROM TABLE_A WHERE CAST(IFNULL(COLUMN_A, 0) as INTEGER) >= '15'
問題を解決しました。行われた別のテストは次のとおりです。
SELECT * FROM TABLE_A WHERE COLUMN_A >= '15'
また、正しい結果が返されました。
これは、Android が IFNULL 句を使用してパラメーターを (文字列として) クエリにバインドする方法に関連する問題のようです。
それで、なぜこれが起こったのか誰か知っていますか?クエリで CAST を使用せずにこれを解決するための提案はありますか?