如何在SQL 语句的bind.data
参数中同时传递标量和一组值,例如dbGetQuery()
select * from tst where x = ? and y in (?)
这是我尝试过的:
> library("RSQLite")
> c <- dbConnect (SQLite())
> dbGetQuery(c, "create table tst (x int, y int)")
> dbGetQuery(c, "insert into tst values (?, ?)", data.frame(x=c (1,2,1,2), y=c(3, 4, 5, 6)))
> dbReadTable(c, "tst")
x y
1 1 3
2 2 4
3 1 5
4 2 6
> dbGetQuery (c, "select * from tst where x = ? and y not in (?)", data.frame(x=2, y=I (list(7,6))))
Error in sqliteFetch(rs, n = -1, ...) :
RAW() can only be applied to a 'raw', not a 'double'
从阅读源代码开始,任何非 data.framebind.data
参数都会被强制通过as.data.frame()
,所以我想尝试除数据帧之外的任何东西都没有什么意义。
注意:哎呀,似乎即使绑定一个集合也是有问题的:
> dbGetQuery(c, "select * from tst where y not in (?)", c(7,6))
x y
1 1 3
2 2 4
3 1 5
4 2 6
5 1 3
6 2 4
7 1 5
这清楚地表明从 R 发送了 2 个单独的查询(其中一个返回 4,其中一个返回 3 个结果);SQLite 永远不会看到设置参数。
较早的注释:我希望数据库引擎过滤适当的行,我不希望 R 计算笛卡尔积。在上面的示例中,简单地摆脱I()
创建一个 2 行数据帧(感谢 R 的回收),其中之一就是解决方案。R 将这两行中的每一行发送到 sqlite,当然第二行匹配。但以下显示 SQLite 引擎实际上并没有使用常规 data.frames 接收设置参数:
> dbGetQuery(c, "select * from tst where x in (?) and y in (?)", data.frame(x=c(3,2), y=c(6,7)))
[1] x y
<0 rows> (or 0-length row.names)
> dbGetQuery(c, "select * from tst where x in (?) and y in (?)", data.frame(x=c(3,2), y=c(7,6)))
x y
1 2 6