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)
我 运行 遇到一个问题,我正在调用 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)