通过 R 在 SQL 查询中粘贴值

Posted

技术标签:

【中文标题】通过 R 在 SQL 查询中粘贴值【英文标题】:Pasting Values in SQL Query through R 【发布时间】:2017-09-24 13:04:31 【问题描述】:

我有以下包含 AxiomaID 的数据框。

x<-c(0123, 234, 2348, 345, 3454)

并尝试在 R 中运行以下 SQL 查询。

 SQL6<-data.frame(sqlQuery(myConn, "SELECT top 10 [AxiomaDate] 
  ,[RiskModelID]
  ,[AxiomaID]
  ,[Factor1]
   FROM [PortfolioAnalytics].[Data_Axioma].[SecurityExposures]
   Where AxiomaID = x"))

如何将所有包含 AxiomaID 的 x 值粘贴到 SQL 查询中?

【问题讨论】:

你有什么错误吗?如果是,请在您的问题中提及。这真的很有帮助。 R 中的 SQL 查询将 x 读取为 x,因为查询在引号中。 42S22 207 [Microsoft][ODBC SQL Server Driver][SQL Server]列名“x”无效 【参考方案1】:

尝试以下查询:

SQL6<-data.frame(sqlQuery(myConn, paste("SELECT top 10 [AxiomaDate] 
  ,[RiskModelID]
  ,[AxiomaID]
  ,[Factor1]
   FROM [PortfolioAnalytics].[Data_Axioma].[SecurityExposures]
   Where AxiomaID IN (", paste(x, collapse = ", "), ")")))

希望对你有帮助!

【讨论】:

不完全 - x 中的 AxiomaID 需要在 '' 中。因此,第一个值作为“0123”进入查询,而不是当前的 0123。是否有一种简单的方法可以为所有 AxiomaID 添加“”?注意我有更多的 ID,所以自动化程度越高越好! 好的。那我试试吧 你想要这样:where AxiomaID IN ('0123','234'...) ? 是的,有没有简单的方法可以做到这一点? 那么我认为您应该将向量中的值保存为字符串而不是数字。像 x 【参考方案2】:

你会尝试类似的功能

InsertListInQuery <- function(querySentence, InList) 
  InValues <- ""
for (i in 1:length(InList))
  if (i < length(InList)) 
    InValues <- paste(InValues,InList[[i]],",")
  else 
    InValues <- paste(InValues,InList[[i]],sep = "")
  


  LocOpenParenthesis <- gregexpr('[(]', querySentence)[[1]][[1]]
  LocCloseParenthesis <- gregexpr('[)]', querySentence)[[1]][[1]]
  if (LocCloseParenthesis-LocOpenParenthesis==1) 
    querySentence<- gsub("[(]", paste("(",InValues,sep = ""), querySentence)
  
 return (querySentence )

函数 InsertListInQuery 要求您将原始查询更改为在 WHERE 子句中使用约束 IN () 的查询。函数的作用是将字符串与以逗号分隔的向量元素进行匹配,并将“(”字符串替换为组合的字符串。最后,返回一个字符变量。 因此,您可以定义元素的约束列表向量、查询并调用函数,如下所示:

x<-c(0123, 234, 2348, 345, 3454)
query <- "SELECT top 10 [AxiomaDate] 
  ,[RiskModelID]
,[AxiomaID]
,[Factor1]
FROM [PortfolioAnalytics].[Data_Axioma].[SecurityExposures]
Where AxiomaID IN ()"
finalQuery <- InsertListInQuery(query, x)

finalQuery 的值为:

finalQuery
[1] "SELECT top 10 [AxiomaDate] \n  ,[RiskModelID]\n,[AxiomaID]\n,[Factor1]\nFROM [PortfolioAnalytics].[Data_Axioma].[SecurityExposures]\nWhere AxiomaID IN ( 123 , 234 , 2348 , 345 ,3454)"

注意行回车带有特殊字符\n。

希望对你有帮助。

【讨论】:

以上是关于通过 R 在 SQL 查询中粘贴值的主要内容,如果未能解决你的问题,请参考以下文章

R 中的粘贴函数在构建 SQL 查询时不起作用

将R数据帧带入带有粘贴功能的sql可用列表

使用粘贴功能将 R 数据框带入 sql 可用列表

R粘贴字符串折叠 - 如何用引号保留字符串?

将多行查询粘贴到 BigQuery SQL shell

将向量中的值粘贴到 R 中的列名