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

时间:2013-11-25 03:37:41

标签: r sqldf

如何将列名作为参数传递给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')

作品。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

解决方案:

您可以使用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    

这是official explaination

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_names select语句而不是sqldf创建names(iris)变量的原因。

答案 2 :(得分: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"