如何通过 R 在 Postgresql 中更改带有变量的 SET 列名称?

How to change SET column name with variable in Postgresql through R?

我在 Postgresql 中有一个解析 table,它由几列组成,即解除绑定、堵塞和脏。 此列包含数字。

我想根据用户选择的“问题”在列中更新一个值+1。例如“堵塞”。

issue="clogging"
currentdata <- dbGetQuery(con,paste0("SELECT DISTINCT *
                                                FROM analytic
                                                ORDER BY analytic.id DESC
                                                FETCH FIRST 1 ROWS ONLY;"))
issueval <- currentdata[[issue]]

sql <- sqlInterpolate(con, 
                      "UPDATE analytic 
                      SET issue = ?val
                      where id = ?code",
                      code = "ID111",
                      val = issueval+1
)
dbSendQuery(con,sql)

如何根据用户选择的问题更改SET“列名”

谢谢

我的答案通常是 data-binding,使用 DBI::dbBindDBI::dbGetQueryparams= 参数。不幸的是,这仅适用于数据,不适用于标识符(例如,列名)。

一个可以仍然使用sqlInterpolate。试试这个:

issue <- "clogging"
sql <- sqlInterpolate(con, 
                      "UPDATE analytic 
                      SET ?col = ?val
                      where id = ?code",
                      col = dbQuoteIdentifier(con, issue),
                      code = "ID111",
                      val = issueval+1)

这样做的一个风险是名称 case:在 table 中定义列时,有很多关于 case-sensitivity 主题的建议,其中一个常见的建议是始终转换为 lower-case。如果该列实际上是用大小写混合定义的,那么当您使用 dbQuoteIdentifier 时,您必须完全正确

如果您 运行 遇到此问题并且不想要求用户始终正确,您可以随时执行以下操作:

realfields <- dbListFields(con, "analytic")
issue <- realfields[ match(tolower(issue), tolower(realfields)) ]
# similarly
issue <- grep(paste0("^", issue, "$"), realfields, value = TRUE, ignore.case = TRUE)