【发布时间】:2020-05-22 18:33:03
【问题描述】:
我在 Shiny 应用程序中有一个 textInput 供用户编写由逗号分隔的三个字符产品代码。例如:F03、F04、F05。
textInput 的输出用于调用 sql 脚本的函数。它将在sql语句中用作过滤器,例如
sqlfunction <- function(text){
sqlQuery(conn, stri_paste("select .... where product_code in (", text, ");"))
}
为了将 textInput 转换为我可以在 sql 语句中使用的字符串,我使用了
toString(sprintf("'%s'", unlist(strsplit(input$text_input, ","))))
这可以工作并将 textInput 转换为“F03”、“F04”。 'F05' 然而,当在 sql 中使用时,只有第一个代码 'F03' 用于搜索,尽管在 () 中使用了 product_code。返回的数据只有产品代码为 F03 的数据。
如何将所有三个代码(如果不是更多)用 textInput 写入一个字符串以在 sql 子句中使用?
安德鲁
【问题讨论】:
-
您能否包含一些
input$text_input的示例值? -
(1) SQL 注入,不要只是
paste你的代码(xkcd.com/327)。最好使用至少类似glue::glue_sql的东西,但更有可能使用类似DBI::dbBind或至少DBI::sqlInterpolate的东西(我更喜欢DBI::dbBind)。 db.rstudio.com/best-practices/run-queries-safely。 (2) 使用"'%s'"很好,使用sQuote或(首选)DBI::dbQuoteString会更好。 -
您的前提看起来不错,至于为什么
in (...)不起作用听起来 DBMS 没有按预期方式工作,或者数据没有像您认为的那样变化。假设您在专门寻找数据时可以找到具有其他值的数据是否安全? -
我怀疑@Jrm_FRL 的回答可能有问题。您可以考虑使用
trimws(unlist(strsplit(...))删除前导/尾随空格。