【问题标题】:r column values in sql where statementsql where语句中的r列值
【发布时间】:2022-02-17 04:27:38
【问题描述】:

我有一个数据集,我正在尝试将特定列的内容传递到 SQL where 语句中。

例如,假设 iris 是我的数据集

       data(iris)
       head(iris)

       Sepal.Length Sepal.Width Petal.Length Petal.Width Species
       5.1         3.5          1.4         0.2  setosa
       4.9         3.0          1.4         0.2  setosa
       4.7         3.2          1.3         0.2  setosa
       4.6         3.1          1.5         0.2  setosa
       5.0         3.6          1.4         0.2  setosa
       5.4         3.9          1.7         0.4  setosa

我想将 Species { setosa, setosa, setosa.....setosa} 列的内容传递给我的 sql 查询 where 语句

sqlQuery(abcd, paste("Select * from TestTableName1 
                       where WHERE DESCRIPTION 
                          IN (values of Species column from r dataframe)");

这里需要帮助

【问题讨论】:

  • sqlQuery 不是来自 sqldf 包。它来自RODBC 包。此外,您的 select 语句中有两个 where
  • 你可以试试这个查询:strwrap(paste("Select * from TestTableName1 where WHERE DESCRIPTION IN (" , paste( unique(iris$Species), collapse=' ,') , ")"))

标签: sql r sqldf


【解决方案1】:

您的问题实际上是关于字符串操作的(偶然的是,您的字符串最终会传递给sqldf),答案是您将其粘贴在一起,或者如果您觉得很花哨,可以使用sprintf

vals = paste(paste0('"', levels(iris$Species), '"'), collapse = ", ")
vals
## [1] "\"setosa\", \"versicolor\", \"virginica\""

vals.paren = paste0("(", vals, ")")

qry = paste("select * from table where description in ", vals.paren)
qry
## [1] "select * from table where description in  (setosa, versicolor, virginica)"

# sprintf makes the bounding parentheses cleaner

qry = sprintf("select * from table where description in (%s)", vals)
qry
## [1] "select * from table where description in (setosa, versicolor, virginica)"

【讨论】:

  • 您是否故意在行首添加>?我很想编辑这个答案...
  • 只是从我的控制台复制/粘贴,懒惰。欢迎编辑。 (虽然我想我可以自己花点时间。)编辑:击败我,谢谢!
  • 这将返回一个没有“”值的列表。它在 SQL Where 子句中不起作用。
  • @Giacomo 编辑添加引号。
【解决方案2】:

通过在 gsubfn package 字符串中插入任何带有 fn$ 的函数调用,可以对其参数启用插值。请参阅?fn 了解更多信息。这通常与sqldf package 中的sqldf 一起使用,但可以与我们在这里展示的任何函数一起使用。特别是在函数调用的字符串参数中插入$variable 会将该变量的值替换为该字符串:

library(gsubfn)
lvls <- toString(shQuote(levels(iris$Species)))

fn$sqlQuery(abcd,  "select * from TestTableName1 where DESCRIPTION in ($lvls)")

或者如果我们想先检查字符串:

sql <- fn$identity("select * from TestTableName1 where DESCRIPTION in ($lvls)")
cat(sql, "\n") # look at sql string

sqlQuery(abcd, sql)

cat 语句的输出是:

select * from TestTableName1 where DESCRIPTION in ("setosa", "versicolor", "virginica") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多