我有一个SQLite数据库,我使用RSQLite包为R查询。我有一个分类矢量,我希望以此过滤查询,以使查询看起来像这样:

dbGetQuery(mydb,
           'select PLT_CN, INVYR
            from GRM
            where ESTN_TYPE = "AL"')


这通常可以正常工作,并返回ESTN_TYPE级别为AL的所有数据。

然而。

它不会这样做。这是因为在存储数据的.csv文件中,实际上将AL值输入为"AL"。因此,当我查询AL时,我的查询返回零数据。我怎样才能解决这个问题?

(感谢@Parfait,让我意识到这是上一个问题中我真正的问题)。

最佳答案

RSQLite

library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
df <- data.frame(a=1:5, b=sprintf('"%s"', letters[1:5]), stringsAsFactors=F)
df
#   a   b
# 1 1 "a"
# 2 2 "b"
# 3 3 "c"
# 4 4 "d"
# 5 5 "e"
dbWriteTable(con, "tbl", df)
# [1] TRUE
dbGetQuery(con, 'select * from tbl')
#   a   b
# 1 1 "a"
# 2 2 "b"
# 3 3 "c"
# 4 4 "d"
# 5 5 "e"
dbGetQuery(con, 'select * from tbl where b="a"')
# [1] a b
# <0 rows> (or 0-length row.names)


无论如何,使用参数化查询通常是一件好事,所以可以说两鸟一石:

dbGetQuery(con, 'select * from tbl where b=:x', params=list(x='"a"'))
#   a   b
# 1 1 "a"
dbGetQuery(con, 'select * from tbl where b in (:x)', params=list(x=c('"a"','"c"')))
#   a   b
# 1 1 "a"
# 2 3 "c"


RMySQL

(我没有方便的mysql实例,所以这是一个猜测。)

使用@x代替:x

dbGetQuery(con, 'select * from tbl where b=@x', params=list(x='"a"'))

关于mysql - 将分类向量存储在引号中时的RSQLite查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43946669/

10-12 13:58
查看更多