Android 参数化SQLite查询的奇怪行为
如果你能想出更好的方法,请随意改进问题标题Android 参数化SQLite查询的奇怪行为,android,sql,sqlite,parameterized-query,Android,Sql,Sqlite,Parameterized Query,如果你能想出更好的方法,请随意改进问题标题 问题:考虑以下SQLite查询: SELECT COUNT(*) FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= ? 这可能与参数作为字符串传递有关,但是,唉,没有其他方法可以将参数传递给SQLite API,因此我想我在这里没有做错任何事情,SQLite的工作就是正确地转换值。在使用非参数化版本的查询时,我还观察到以下情况,这可能与问题有关,也可能与问题无关
问题:考虑以下SQLite查询:
SELECT COUNT(*)
FROM (SELECT 1 AS value UNION SELECT 2 AS value)
WHERE value <= ?
这可能与参数作为字符串传递有关,但是,唉,没有其他方法可以将参数传递给SQLite API,因此我想我在这里没有做错任何事情,SQLite的工作就是正确地转换值。在使用非参数化版本的查询时,我还观察到以下情况,这可能与问题有关,也可能与问题无关:
SELECT COUNT(*)
FROM (SELECT 1 AS value UNION SELECT 2 AS value)
WHERE value <= 1 -- yields 1
SELECT COUNT(*)
FROM (SELECT 1 AS value UNION SELECT 2 AS value)
WHERE value <= '1' -- yields 2
rawQuery文档中说:
[…]您可以在查询中的where子句中包含?s,该子句将被selectionArgs中的值替换。这些值将被绑定为字符串
并引用:
比较的结果取决于
操作数,根据以下规则[…]
整数或实数值小于任何文本或BLOB值。
因为1和2都是整数,所以它们都小于“1”文本值。这就是为什么这句话:
SELECT 2 <= '1'
。。。在SQLite中返回1
你可能应该使用
WHERE value <= CAST('1' AS INTEGER)
。。。相反或者,您可以使用这样一个事实,即所有数学运算符都将两个操作数强制转换为数值存储类,其中的值可能为。您可以使用选择“1”和选择“2”,就是这样,谢谢!所以,参数的自动类型调整只在将它们直接和数据库列进行比较时起作用。。。很高兴知道。
WHERE value <= CAST('1' AS INTEGER)
SELECT * FROM myTable WHERE _id < ?