database.query 准备语句绑定不起作用

database.query prepare statement binding not working

我有这个准备语句工作

String [] selectionArgs = new String[]{level, col1, col1_value};

db.query(Table, null,                      //table & columns
         level + " = ? AND " +             //selection 
            "? != ? AND " +
            "length(" + col1 + ") = " + col1.length,  //**here is question point**
         selectionArgs,                    // selectionArgs
         null, null, "RANDOM()",           // order by
         Integer.toString(count));         // number of retrieve

注意长度是原始内联的。不是用“?”它正在运行。

但是当我把它改成下面的样子时

String [] selectionArgs = new String[]{level, col1, col1_value, 
                                   col1, Integer.toString(col1.length)}; //added for length

db.query(Table, null,                      //table & columns
         level + " = ? AND " +             //selection 
            "? != ? AND " +
            "length(?) = ?",  //**here is question point**
         selectionArgs,                    // selectionArgs
         null, null, "RANDOM()",           // order by
         Integer.toString(count));         // number of retrieve

它不再工作了。

有谁知道为什么会这样。如果你有,请给我一些解释。提前谢谢大家

我注意到你的查询,你正在使用 Integer.toString(col1) 将你的整数值转换为字符串,然后你试图比较这个字符串具有整数值长度(?)的值。

您之前的查询有效,因为您没有转换字符串中的值。 length(col1) 都是 return 整数,col1.length 也是 return 整数。

working query -->"length(" + col1 + ") = " + col1.length, //这里是问题点

但在这种情况下,长度 (?) 是 returning 整数,下一个“?”这是 Integer.toString(col1) 是字符串值,因此在比较的情况下这里是类型不匹配。 查询无效 --> "length(?) = ? ", //这里是问题点

您可以使用 ? 仅绑定文字值,而不是列名等标识符。

所以带有 "col1", "col1_value" args 的 ? != ?'col1' != 'col1_value' 相同,并且表达式始终为真。

此外 length(?) = ?"col1", "4"length('col1') = 4 相同,这也总是正确的。但是在你的第一种形式中你有它像 length(col1) = 4 它测试列 col1 中值的长度而不是文字 'col1' 所以有可能它只对你的那些行是真的'重新感兴趣,这就是它似乎有效的原因。