SQLDF 更新忽略更新

SQLDF Update ignoring the Update

我 运行 遇到一个问题,我正在调用 sqldf 对添加的行进行更新。我已经阅读了 sqldf 文档并遵循了他们的示例,并且没有出现超出正常 "must utilize dbExecute()" 之外的警告。但是,无论我如何更改语句,即使是非常简单的事情,它也会忽略更新。

```{r}
df$DiscPric = 0
head(df,5)

sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5"))
sqldf(c("UPDATE df SET DiscPric = Total Where NumOfItems < 5"))
```;

以下是更改前创建的数据框、添加的新列和更新。我不知道语法是否错误,但它没有标记它。当我尝试切换到更简单的更新时,例如 "UPDATE df SET Total = 0 Where InvoiceId = 1" 它也忽略了这个简单的更新

sqldf并没有更新R中的变量,只是将数据导入到sqlite中,然后进行处理。如果你想更新 替换 R 版本的 df,你需要 运行 两个查询并覆盖 df.

类似于:

df$DiscPric = 0
head(df,5)

DF <- sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5",
              "SELECT * from main.df"))
DF <- sqldf(c("UPDATE df SET DiscPric = Total Where NumOfItems < 5",
              "SELECT * from main.df"))

或者更简洁:

df$DiscPric = 0
head(df,5)

DF <- sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5",
              "UPDATE main.df SET DiscPric = Total Where NumOfItems < 5",
              "SELECT * from main.df"))

或使用case when ... then ... end(一个SQL函数):

df$DiscPric = 0
head(df,5)

DF <- sqldf(c("UPDATE df SET DiscPric = Total * (case when NumOfItems >= 5 then 0.9 else 1 end)",
              "SELECT * from main.df"))

请参阅 https://github.com/ggrothendieck/sqldf#8-why-am-I-having-problems-with-update 了解更多说明(向下滚动到第 8 个标题,link 并不总是在 github 内将您带到那里)。

请注意,main. 在第二个(及后续)查询中 是必需的 (并且不得在第一个查询中)。没有它,第二个查询中的 sqldf 将再次从 R 环境中拉取 df,忽略第一个查询的更新。 main. 是 sqlite 的数据库名称,因此它告诉 sqlite/sqldf 在其模式中使用 already-present table。


但在紧要关头,您可以直接在 R 中执行此操作而无需 sqldf,以防这不是一个简化的示例:

x$DiscPric <- x$Total * ifelse(x$NumOfItems >= 5, 0.9, 1)