android – 参数化SQLite查询的奇怪行为

android – 参数化SQLite查询的奇怪行为,第1张

概述(如果你能想到更好的东西,请随意改进问题标题.) 问题:考虑以下SQLite查询: SELECT COUNT(*) FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= ? 当我使用1作为参数时,我希望查询产生1,但它产生2.为什么会发生这种情况? 附加信息: 这是重现问题的最小工作示例(Android): Curso (如果你能想到更好的东西,请随意改进问题标题.)

问题:考虑以下sqlite查询:

SELECT COUNT(*)  FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= ?

当我使用1作为参数时,我希望查询产生1,但它产生2.为什么会发生这种情况?

附加信息:

这是重现问题的最小工作示例(AndroID):

Cursor c = db.rawquery(        "SELECT COUNT(*) " +        "  FROM (SELECT 1 AS value UNION SELECT 2 AS value) " +        " WHERE value <= ? ",new String[] {String.valueOf(1)});c.movetoFirst();Log.i("","Result: " + String.valueOf(c.getInt(0)));

它可能与参数作为字符串传递这一事实有关,但是,唉,没有其他方法可以将参数传递给sqlite API,所以我想我在这里没做任何“错误”而且它是sqlite的工作来适当地转换价值.在使用非参数化版本的查询时,我也观察到以下情况(这可能与问题有关,也可能与此无关):

SELECT COUNT(*)  FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= 1              -- yIElds 1SELECT COUNT(*)  FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= '1'            -- yIElds 2
解决方法 在rawquery文档中说:

[…] You may include ?s in where clause in the query,which will be replaced by the values from selectionArgs. The values will be bound as Strings.

并且,引用SQLite doc:

The results of a comparison depend on the storage classes of the
operands,according to the following rules […]

An INTEGER or REAL value is less than any TEXT or BLOB value.

由于1和2都是整数,因此它们都小于’1′(TEXT值).这就是为什么这句话:

SELECT 2 <= '1'

…在sqlite中返回1.

你可能应该使用……

WHERE value <= CAST('1' AS INTEGER)

……而是.或者您可以使用以下事实:所有数学运算符都将 *** 作数转换为NUMERIC存储类,其WHERE值为< =?,但这不太干净,imo. 请注意,在此查询中:

SELECT * FROM mytable WHERE _ID < ?

… the value of ? will get its affinity adjusted to the affinity of _id column – 因此如果_ID为NUMERIC,它们将作为数字进行比较.

总结

以上是内存溢出为你收集整理的android – 参数化SQLite查询的奇怪行为全部内容,希望文章能够帮你解决android – 参数化SQLite查询的奇怪行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1129139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存