如何通过 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::dbBind
或 DBI::dbGetQuery
的 params=
参数。不幸的是,这仅适用于数据,不适用于标识符(例如,列名)。
一个可以仍然使用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)
我在 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::dbBind
或 DBI::dbGetQuery
的 params=
参数。不幸的是,这仅适用于数据,不适用于标识符(例如,列名)。
一个可以仍然使用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)