首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WRDS MSRB数据集上的SQL查询从许多CUSIP检索数据

使用WRDS MSRB数据集上的SQL查询从许多CUSIP检索数据
EN

Stack Overflow用户
提问于 2020-10-04 19:34:36
回答 1查看 205关注 0票数 0

我对SQL非常陌生,所以我很抱歉,如果这是一个简单的问题,我在搜索时没有找到任何东西,但我可能错过了明显的搜索条件。

我正在尝试下载一组市政债券的所有交易数据,其中我有一个CUSIP列表,当前存储为一个.txt文件,每行有一个CUSIP。WRDS的在线版本允许用户上传这样的.txt文件来检索他们的数据。

我想在R中自动化这个过程,并按照WRDS指南在R中设置SQL查询,最后我将使用以下内容

代码语言:javascript
复制
res <- dbSendQuery(wrds, "select *
               from msrb.msrb
               where cusip IN ???")
data <- dbFetch(res, n=-1)
dbClearResult(res)
data

我如何将我的CUSIP列表实际输入查询?直接列出每个CUSIP太长了。我可以以某种方式引用.txt文件,或者至少在R中引用字符向量吗?有没有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-05 14:50:22

我认为有两种有效的方法可以编程地在SQL中执行IN (...),还有一种方法很流行,但风险很大(我通常不赞成)。

使用参数绑定的

  1. 。这在某种主观限制下是可行的;对于DBI允许绑定多少参数可能有一个真正的限制,但我不知道;我不知道IN (...)实现是否经常限制您可以放在文字IN (...)语句中的值的数量(我刚刚用5000测试了PG11,没有问题)。在某种程度上,使用下面的备选案文2可能更有效或更可取。然而,如果我们说的是这么多,那就试试这个。

cusip <- c(.)#向量cusips params <-粘贴(paste0(“$ ",seq_along(Cusip)),cusip=”,") ret <- DBI:dbGetQuery(con,粘贴(“select* from msrb.msrb msrb.msrb cusip in (",params,")"),params =as.list(Cusip))

($1, $2, $3)的使用是针对postgres的;其他DBMSes可能使用不同的名称,包括(?,?,?) (sql server和其他)。

  1. 将ids上载到临时表并对其进行查询。(如果从另一个查询获取要使用的if,只需更新内部SQL以反映其他查询,也可以部分使用。)

CUSIPs <- c(.)#向量cusips tmptbl <- paste0("tmptable_",con(sample(9),con=“”)DBI:dbWriteTable(con,tmptbl,data.frame(cusip = cusip )) DBI::dbGetQuery(con,粘贴(“从msrb.msrb中选择* cusip in",”,“(从”,tmptbl,“)选择cusip)

或连接到temp表,使用

DBI::dbGetQuery(con,粘贴(“选择msrb.* from ",tmptbl,"t",”左加入t.cusip =t.cusip])

总的来说,

  1. 是使用参数绑定的坚定拥护者,因为它将绕过任何形式的SQL注入,无论是恶意的还是偶然的。但是,如果您在匆忙中,您可以自己组成IN (...)。您可以使用glue::glue_sql确保始终使用正确的引号(针对特定DBMS);如果没有,使用单引号通常是安全的。

cusip <- c(.)#向量cusip参数<- glue::glue_sql(“( "),粘贴(Cusip),折叠= ",”)#或params <- glue::glue_sql(“({cusip*})”,.con = con) DBI::dbGetQuery

注意,glue::glue_sql提供了*表示法。来自?glue::glue_sql

如果在胶表达式的末尾放置“*”,则值将用逗号折叠。例如,这对于SQL运算符很有用.

对于所有三种方法,我都使用了更直接的DBI::dbGetQuery,但如果您愿意,仍然可以使用DBI::dbSendQuery/DBI::dbFetch两步。

根据msrb表及其索引的大小,这些查询可能不会影响所有优化。如果是这样的话,请考虑根据来自DBA的建议添加到查询中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64199024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档