Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用R向量查询sqlite数据库的有效方法_Sqlite_R - Fatal编程技术网

用R向量查询sqlite数据库的有效方法

用R向量查询sqlite数据库的有效方法,sqlite,r,Sqlite,R,我在R中有一个值向量,希望从sqlite数据库中获取响应值。我使用以下代码 values = c() for (a in keys) { result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a) values = c(values,results) } values=c() 用于(钥匙中的a) { 结果如果aacontent不是很大,那么将其全部读入R,并使用R的match函数、sql

我在R中有一个值向量,希望从sqlite数据库中获取响应值。我使用以下代码

values = c()

for (a in keys)
{
    result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a)
    values = c(values,results)
}
values=c()
用于(钥匙中的a)
{

结果如果aacontent不是很大,那么将其全部读入R,并使用R的match函数、sqldf函数或data.table函数之类的函数


如果aacontent太大,而键太小,则将键写入sqlite表并执行联接查询。在其中一个或两个表上创建索引可能会对您有所帮助。

这些都是从R中为类似的SQL查询任务预建的工具(因为您使用的是sqlite,我一定要签出sqldf),但根据我的经验,我最终编写了许多用于构建查询的小助手包装函数

例如,在您的情况下,您的问题并不是真正的R部分,而是希望将
键中的所有值滚动到一个查询中。因此,您希望查询看起来更像:

SELECT content FROM aacontent WHERE Id IN (val1,val2,...)
然后诀窍是在R中使用
paste
来构建
in
子句。我倾向于在
dbGetQuery
上使用一个简单的包装函数,它使用
参数和
paste
将不同部分的查询缝合在一起。类似这样:

myQuery <- function(con,...){
    arg <- list(...)
    res <- dbGetQuery(con,paste(arg,collapse = ""))
    res
}
请注意,如果
中的值是字符,则会有点困难,因为您需要使用
粘贴
进行更多的工作,以在每个元素周围获得单引号,但这并不是更多的工作


如果所讨论的数据库相当小,则此建议更为相关;如果您正在处理较大的数据,则Spacedman的建议可能更值得研究。

我可能会将您的SQL查询从
Id=
更改为
Id in(…)
键中的值是否为字符、数字等?它们是字符。您是否建议将整个向量放在in之后的括号中?这是否会保留正确的顺序?可能不会(这取决于
键的顺序)。我会在查询中同时选择
content
Id
,然后在SQLite中或在R中对结果进行排序。@Spacedman取决于设置的细节。在我的情况下,我的数据库只会被坐在我的计算机旁的人查询,因此我倾向于不担心这些事情,因为如果有人在lly有我的计算机我有比SQL注入攻击更大的问题。是的,但你必须担心的不仅仅是恶意攻击。一旦你开始构造字符串传递给SQL表达式,你就必须担心转义引号和分号等等。是否有SQL转义函数或占位符替换技术R的数据库包?谢谢,编写密钥和执行连接查询非常有帮助。
myQuery(con,"SELECT content FROM aacontent WHERE Id IN (",
             paste(keys,collapse = ","),"))