当分类向量存储在引号中时的 RSQLite 查询
RSQLite query when a categorical vector is stored in quotes
我有一个 SQLite 数据库,我使用 R 的 RSQLite
包进行查询。我有一个分类向量,我想过滤我的查询,这样我的查询看起来像这样:
dbGetQuery(mydb,
'select PLT_CN, INVYR
from GRM
where ESTN_TYPE = "AL"')
这通常可以正常工作,return ESTN_TYPE
级别为 AL
的所有数据。
但是。
它不会这样做。这是因为在存储数据的 .csv
文件中,值 AL
实际上输入为 "AL"
。所以,当我查询 AL
时,我查询 return 的零数据。我该如何解决这个问题?
(感谢@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"'))
我有一个 SQLite 数据库,我使用 R 的 RSQLite
包进行查询。我有一个分类向量,我想过滤我的查询,这样我的查询看起来像这样:
dbGetQuery(mydb,
'select PLT_CN, INVYR
from GRM
where ESTN_TYPE = "AL"')
这通常可以正常工作,return ESTN_TYPE
级别为 AL
的所有数据。
但是。
它不会这样做。这是因为在存储数据的 .csv
文件中,值 AL
实际上输入为 "AL"
。所以,当我查询 AL
时,我查询 return 的零数据。我该如何解决这个问题?
(感谢@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"'))