0

如何将列名作为参数传递给 R sqldf 中的 SQL?

两者都不

q <- "Q10"

A = fn$sqldf('SELECT * FROM Customer WHERE $q < 100')

或者

q <- "Q10"

A = fn$sqldf('SELECT * FROM Customer WHERE '$q' < 100')

作品。

4

3 回答 3

4

sprintf()在这种情况下会很有效。就个人而言,我发现使用sprintf()的代码比paste().

q <- "Q10"
sql <- sprintf("SELECT * FROM Customer WHERE %s < 100", q)

sql
[1] "SELECT * FROM Customer WHERE Q10 < 100"

事实上,您可以在编译复杂的 SQL 查询方面走得更远。只是为了说明:

q <- "Q10"
value <- "150"
sql <- sprintf("SELECT * FROM Customer WHERE %s < %s", q, value)

sql
[1] "SELECT * FROM Customer WHERE Q10 < 150"
于 2014-02-27T11:01:05.553 回答
2

解决方案:

您可以使用paste命令连接变量和字符串。

> library(sqldf)
> my_names <- names(sqldf("select * from iris limit 10"))
> sqldf(paste("select",my_names[1], "from iris limit 2", sep=" "))
      Sepal_Length
1          5.1
2          4.9

fn$用于执行字符串插值,最后一行可以写成:

> fn$sqldf("select `my_names[1]` from iris limit 2")

潜在问题:

当您尝试使用 sqldf 进行查询时,名称可能会有所不同。例如,数据集的默认名称iris是:

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species" 

但是,当您尝试使用列名进行查询时,必须以不同的方式格式化名称:

> sqldf("select * from iris limit 1")
  Sepal_Length Sepal_Width Petal_Length Petal_Width Species
1          5.1         3.5          1.4         0.2  setosa    

这是官方的解释

Here is an example of sorting and limiting output from an SQL select statement on the iris data frame that comes with R. Note that although the iris dataset uses the name Sepal.Length the RSQLite layer converts that to Sepal_Length.

这就是在我的解决方案中我首先my_namessqldfselect 语句而不是names(iris).

于 2013-11-25T05:00:47.367 回答
0

对我来说, sprintf 是完美的解决方案,你需要将 %s 更改为 %d 我认为的整数。

q= 'Q10' ; value= 150
sql <- sprintf("SELECT * FROM Customer WHERE %s < %d", q, value)

sql
[1] "SELECT * FROM Customer WHERE Q10 < 150"
于 2015-10-15T12:15:39.627 回答