大佬教程收集整理的这篇文章主要介绍了android – 参数化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 1 SELECT COUNT(*) FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= '1' -- yields 2
并且,引用SQLite doc:
由于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查询的奇怪行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。