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'
所以有可能它只对你的那些行是真的'重新感兴趣,这就是它似乎有效的原因。
我有这个准备语句工作
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'
所以有可能它只对你的那些行是真的'重新感兴趣,这就是它似乎有效的原因。