SQL оператор с собственным R-объектом - PullRequest
0 голосов
/ 20 января 2020

Я использую базу данных Oracle SQL, к которой я обращаюсь из R. Возможно ли запросить базу данных Oracle, используя собственные объекты R в операторе, например, чтобы присоединить таблицу БД к кадру данных ?

Установка условий where прекрасно работает из R следующим образом:

oraConnect::load_from_db(sprintf('select * from dual where DUMMY = %s', 'X'))

Возможно ли, например, присоединить таблицу данных БД к таблице данных R следующим образом ( не работает как написано) путем вставки объекта R в оператор oracle SQL?:

testdf = data.frame(DUMMY = 'X')
oraConnect::load_from_db(sprintf('select DUMMY from dual join %s rdf on dual.DUMMY = rdf.DUMMY', testdf))

1 Ответ

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

В этом ответе не используется пакет oraConnect, но его можно использовать для подключения к Oracle базам данных, если на вашем компьютере настроено соединение odb c.

Подключение

Сначала загрузите пакеты и подключитесь к базе данных

library(odbc)
library(DBI)
con <- dbConnect(odbc(), 'YOUR_DSN')

После установки соединения вы можете выполнить быстрый тестовый запрос. Я использую SendQuery, Fetch и Clear. Вам не нужно этого делать, но это позволяет избежать некоторых конфликтов и т. Д. c и упрощает обработку больших объемов данных. Обратите внимание, что «имя_схемы» - это имя схемы в вашей базе данных, если требуется.

query <- DBI::dbSendQuery(con, "SELECT * FROM schema_name.table WHERE ROWNUM <= 10")
out <- DBI::dbFetch(query)
DBI::dbClearResult(query)

Объект out будет содержать ваши данные.

Автогенерация запросов

Теперь это где я буду использовать glue пакет

library(glue)

dat  <- c("apples", "pears", "oranges")

(my_new_query <- glue("SELECT * FROM schema_name.table_name WHERE id = {dat}"))

# SELECT * FROM schema_name.table_name WHERE id = apples
# SELECT * FROM schema_name.table_name WHERE id = pears
# SELECT * FROM schema_name.table_name WHERE id = oranges

или что-то вроде

table_1 <- "cities"
table_2 <- "states"

(my_new_query <- glue("SELECT a.* FROM schema_name.{table_1} LEFT JOIN schema_name.{table_2} ON..."))

#SELECT a.* FROM schema_name.cities LEFT JOIN schema_name.states ON...

, которые вы затем можете отправить в свою базу данных

query <- DBI::dbSendQuery(con, my_new_query)
out <- DBI::dbFetch(query)
DBI::dbClearResult(query)

Вы можете также добавьте в операторы glue такие вещи, как составление списка.


dat  <- c("apples", "pears", "oranges")

(my_new_query <- glue("SELECT * FROM schema_name.table_name WHERE id = IN({glue_collapse(dat, sep = ',')})"))

#SELECT * FROM schema_name.table_name WHERE id = IN(apples,pears,oranges)

, таким образом, все может быть расширено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...