базы данных в R некий датасет, где в блоке WHERE одна из колонок будет указана через IN, и в нем несколько сотен или тысяч значений. Ну например надо вытянуть несколько тыс определенных клиентов по их id.
И вот у меня в R загружена таблица с вектором id этих клиентов. И можно ли как то подставить этот вектор, либо в запрос в R, либо в транслятор sql в dbplyr? Таким образом он отказывается это делать ((
clients <- tbl(bd, "clients") %>%
filter (client_id %in% from_1C$customer_id) %>%
select(2, 8, 9, 10) %>% show_query()
По сути не важно, через dbplyr писать запрос или просто текстом на sql вложить его в скрипт. Главный вопрос, можно ли как то заставить R взять вектор из памяти самого R и превратить его в перечисление в IN, в запросе к бд?)
сформируйте простую строку с запросом с помощью glue и в него положите сконкатенированный в строку вектор идентификаторов типа такого glue('select * from x where y in ({ids})') а ids строка вида '123, 456, 789' вообще, если в in указывать сотни тысяч значений, это не очень хорошо для sql, проще приджойнить
Можно с помощью paste/paste0 собрать правую часть секции IN и отправить получившуюся длинную строку в запрос, который отправить в бд функцией dbSendQuery
Хотел идентичный вопрос написать.
Вопрос в другом, почему все эти манипуляции надо делать в R? лучше оставить data wrangling на стороне БД, насколько это возможно, а в R заниматься более сложными вещами
Потому что БД две. И одной я беру одни данные, и мне надо сравнить их с другой
А что если кинуть тестовый запрос с 3 значениями вместо 100 тысяч и проверить?)
А, вы тут такими темпами в дата инженера на R превратитесь))
не понял) Суть же в том, как скормить именно вектор из R)
Если SQL Server, то он как-то умеет видеть другие sql server, точно не помню как. Прямо SSMS это можно настроить. То есть вы сможете в одном запросе обращаться к таблицам, лежащим на разных серверах
Движок БД тоже разный)
Когда то для себя писал функцию. Вектор со значениями (из дата сета можно достать через pull()) приводит в вид ('xxx','yyy','zzz') u_string<-function(x){ x %>% paste0("'",.,"'") %>% toString() %>% paste('(',.,')') } после этого можно прям xx %>% u_string()->z1 dbGetQuery(connetion,paste0( "select * from table where zz in",z1))
да не за что, можно просто пользоваться - смысл как выше подметили такой же, SQL запрос с точки зрения R - тупо текстовая стринга, все методы процедурной генерации текста - работают
Да я собственно поэтому и очень удивился, когда dbplyr не 'съел' извлеченный вектор из data table фрейма. Отдельно поместил его в текстовый вектор - все заработало
В приведенном примере - ты не извлек вектор, ты сделал датафрейм с одним полем. Соотвествено и на то что это объект - и ругались все
через $ же из дата фрейма извлекается именно вектор?
Я ориентировался на код выше. давай repex разберем
Вот этот. Но я сегодня уже не опробую, спать уже скоро надо))
Обсуждают сегодня