我正在使用sqldf删除下面的三个观察结果。
del_query <- sprintf("DELETE from data_table
where ID_NUMBER IN (%s)",
paste((
'8254700',
'8641472',
'9022163'
), collapse=", "))
sqlQuery(myconn, del_query)
执行查询时,我没有看到任何错误。我也没有得到正确的结果。它只删除ID为8254700的第一个观测值,其余两个观测值,其中ID为8641472或9022163仍然存在。不知道我做错了什么......我需要所有三个观察结果......任何帮助都非常感谢人们。
答案 0 :(得分:2)
假设你有这个数据框:
df <- data.frame(ID = c(8254700, 8641472, 9022163, 1111111, 2222222 ),
field1 = c(1, 2, 3, 4, 5))
,并提供:
> df
ID field1
1 8254700 1
2 8641472 2
3 9022163 3
4 1111111 4
5 2222222 5
要删除这三个记录,您需要添加"SELECT * FROM df"
,否则它将返回NULL
,因为sqldf
始终返回给定的SQL语句的结果,DELETE
不会返回结果。
library(sqldf)
sqldf(c("DELETE FROM df WHERE ID IN (8254700, 8641472, 9022163)", "SELECT * FROM df"))
输出:
ID field1
1 1111111 4
2 2222222 5
如果ID位于单独的向量ids
中,则尝试此操作(输出相同):
ids <- c(8254700, 8641472, 9022163)
fn$sqldf(c("DELETE FROM df WHERE ID IN (`toString(ids)`)", "SELECT * FROM df"))
或检查中间结果:
idString <- toString(ids)
idString
## [1] "8254700, 8641472, 9022163"
sql <- fn$identity(c("DELETE FROM df WHERE ID in ($idString)", "SELECT * FROM df"))
sql
## [1] "DELETE FROM df WHERE ID in (8254700, 8641472, 9022163)"
## [2] "SELECT * FROM df"
sqldf(sql)
## ID field1
## 1 1111111 4
## 2 2222222 5