Как получить данные из sql, ограниченные строками в фрейме данных в R - PullRequest
0 голосов
/ 22 января 2020

Я создал фрейм данных с несколькими учетными записями 2K.

Пример данных выглядит так -

Acct ID
1002
1005
1007
1009

У меня есть соединение odb c, и я хочу получить данные об использовании, которые выглядят следующим образом

Acct ID      Start Date      End Date     Usage
1001         10/1/2019      11/01/2019    100
1001         11/01/2019     12/01/2019    120
1002         02/02/2019     03/01/2019    300
1002         03/02/2019     04/01/2019    450
1003         05/10/2018     06/09/2018    225
1004         07/15/2018     08/13/2018    100
1005         11/12/2019     12/11/2019     50
1006         
1007
1008
1009

Однако чтобы получить эти данные, вытащить sql займет много времени. Я хочу ограничить его учетными записями в моем фрейме данных. По сути, он должен получать информацию только для этих учетных записей - 1002 1005 1007 1009

Как мне это сделать

1 Ответ

1 голос
/ 22 января 2020

Вы можете создать свое предложение WHERE, используя вектор идентификаторов учетных записей.

query <- 
  paste0("SELECT * FROM [TABLE] WHERE [AcctID] IN (", 
         paste0(Dframe$AcctID, collapse = ", "), ")")

query
[1] "SELECT * FROM [TABLE] WHERE [AcctID] IN (1002, 1005, 1007, 1009)"

Это будет работать для числовых значений c в предложении WHERE. Если вам нужно отфильтровать по строкам, вы можете сделать аналогичный шаблон, но вам необходимо: 1) вставить одинарные кавычки вокруг значений и 2) оценить риск SQL атак инъекций.

Параметризованные запросы полезны здесь, но код выглядит немного более отвратительно. Это должно работать как для числовых c, так и для строковых предложений WHERE.

library(DBI)

conn <- dbConnect(...) # make your ODBC connection

Dframe <- data.frame(AcctID = c(1002, 1005, 1007, 1009))


param_list <- lapply(Dframe$AcctID, identity)
names(param_list) <- sprintf("x%s", seq_along(Dframe$AcctID))

query <- paste0("SELECT * FROM [TABLE] WHERE [AcctID] IN (", 
                paste0(sprintf("?%s", names(param_list)), collapse = ", "), ")")

Out <- 
  dbGetQuery(
    conn,
    sqlInterpolate(
      conn,
      query, 
      .dots = param_list
    )
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...