【问题标题】:Use values in df column to create a sql query使用 df 列中的值创建 sql 查询
【发布时间】:2014-10-30 08:31:23
【问题描述】:

我想从数据框中获取值并将它们粘贴到可用作 sql 查询的文本字符串中。在 SAS 我会这样做

proc sql noprint; Select Names into :names separated by ", " from df; quit;

这将创建一个存储所有名称的变量 &name。喜欢:ID、姓名、帐户。我想在 R 中做同样类型的事情,但不知道怎么做。我可以创建一个名称用逗号分隔的向量,每个都用引号括起来,我可以使用 noquote 函数删除引号并将它们放在向量中,但我无法在另一个粘贴语句中获取元素以添加“SELECT “和从。我无法将其全部粘贴。有没有办法提取 Column 上的值并创建一个可在 R 中用作 SQL 查询的文本字符串?这是我在 R 中尝试过的:

name = c("Id", "IsDeleted", "Name", "Credit__Loan__c")
label = c("Record Id", "Deleted", "ID", "Loan")
df = data.frame(name, label)
names(df) <- c("name", "label")

as.query.fields = noquote(paste(df$name, collaspe=", "))
as.query.final <- paste("SELECT " , noquote(paste(df$name, collaspe=", ")), " id FROM Credit_Amortization_Schedule__c")

【问题讨论】:

  • 我认为 whiskerbrew 包在这里会有所帮助。
  • 不知道你有没有意识到,但是你有collapse拼写错误(你有collaspe),这会影响最终的结果。您不需要noquote 函数(它只影响对象的打印方式),您可以直接在sqlQuery(或类似函数)的调用中传递as.query.final 对象来执行查询。
  • 是的,感谢您了解拼写。那只是一个错字,而不是问题。另外,我使用 R 来查询 Salesforce(使用 rforcecom 和 soql),所以我真的需要控制 Select 语句的创建,所以 as.query.final 中的 sqlQuery 不起作用。我唯一能做的就是使用 cat 方法筛选并复制和粘贴结果,然后删除 from 语句之前的尾随逗号。唉,在我的懒惰中,我希望能够完全自动化它,但我做不到。谢谢

标签: r sqldf


【解决方案1】:
data(iris)
colnames(iris)
a <- noquote(paste(colnames(iris), collaspe=", "))
as.query.final <- cat("SELECT " , a, " id FROM Credit_Amortization_Schedule__c")

结果是:

SELECT  Sepal.Length ,  Sepal.Width ,  Petal.Length ,  Petal.Width ,  Species ,   id FROM Credit_Amortization_Schedule__c

然后您可以像这样与 SQL 一起使用:

require(RODBC)
result <- sqlQuery(db, as.query.final)

db 是您的数据库连接

或者,既然我现在看到了你的sqldf 标签,如果你想使用sqldf,那就是:

sqldf(as.query.final)

【讨论】:

  • 我看到你的方法将它打印到屏幕上并且可以工作,但我没有得到它将 cat 的值存储到向量调用 as.query.final 中。当我打印该向量时,它为 NULL。我错过了什么
  • 哦,好吧嗯,我用sqlQuery 测试了它,但也许你用不同的方式使用它或其他什么?如果您可以粘贴您描述的错误/问题,那么我将帮助您解决它
【解决方案2】:

gsubfn 包支持字符串插值:

library(gsubfn)

Names <- toString( sprintf("%s '%s'", df$name, df$label) )
fn$identity("select $Names from myTable")

给予:

[1] "select Id 'Record Id', IsDeleted 'Deleted', Name 'ID', Credit__Loan__c 'Loan' from myTable"

这里还有一些其他示例:SO example 1SO example 2

【讨论】:

  • 这很好用。谢谢,这正是我想做的。它甚至会自动删除最后一个逗号。非常感谢...我在非标准子查询语言中使用查询,所以我需要精确控制输出是什么。
  • 我正在尝试查找 fn$identity 的文档。所以我可以弄清楚如何更好地使用它。我没有在 CRAN pdf 上看到它?我错过了什么?这为我的代码打开了可能性,我想知道更多。我正在翻看包裹,哇!谢谢...
  • 试试:library(gsubfn); ?fn 还有vignette(gsubfn)。主页gsubfn.googlecode.com也有一些信息。
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2023-01-23
  • 2023-03-08
  • 1970-01-01
  • 2015-05-01
相关资源
最近更新 更多