передача параметров RPostgres или RPostgreSQL dbGetQuery () оператору IN - PullRequest
0 голосов
/ 04 декабря 2018

просто интересно, есть ли способ передать произвольное количество параметров в предложение IN через params из dbGetQuery()

, например, с учетом либо

dbcon <- dbConnect(RPostgres::Postgres())
# or: dbcon <- dbConnect(RPostgreSQL::PostgreSQL())

dbExecute(dbcon, "CREATE TEMP TABLE foo AS SELECT i FROM generate_series(1, 10) x(i);")

Могу ли я сделать что-нибудь вроде:

dbGetQuery(dbcon, "SELECT * FROM foo WHERE i IN (1, 2, 3)")

, где идентификаторы представляют собой «краткий список значений», то есть обычно менее 10 целых чисел или строк.Я думал, что мог бы сделать что-то вроде:

ids <- c(1, 2, 3)
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i IN $1", list(ids))

, но лучшее, что я могу сделать, это:

ids <- '{1,2,3}'
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i = ANY($1)", list(ids))

, но затем генерировать ids из набора строк несколькоподвержен ошибкам.

1 Ответ

0 голосов
/ 04 декабря 2018

Вы хотите использовать DBI::sqlInterpolate для генерации динамических запросов.Это лучше, чем небезопасное склеивание запросов.Однако он не очень подходит для векторных входов, поэтому dbplyr::translate_sql работает достаточно хорошо, если вы можете смириться с большим количеством импорта пакетов.Пример:

require(DBI)
require(dbplyr)

con <- dbConnect(RSQLite::SQLite(), dbname = ":memory:")
month_input <- SQL(!!translate_sql(month.abb))
# Or if you don't like lazy-eval NSE nonsense
month_input <- dbplyr:::escape(month.abb)
print(month_input)
# <SQL> ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')

query <- sqlInterpolate(con, "SELECT * FROM colours WHERE month IN ?months",
  months = month_input)
print(query)
# <SQL> SELECT * FROM colours WHERE month IN ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...