回答

收藏

在数据库的dplyr在过滤函数中传输SQL函数

技术问答 技术问答 232 人阅读 | 0 人回复 | 2023-09-14

我正在使用dplyr的自动SQL后端从数据库表查询子表。& i. w  E0 x% D6 h
my_tbl 其中,my_table在数据库中6 u4 o4 T+ D) w
batch_name    valuebatch_A_1     1batch_A_2     2batch_A_2     3batch_B_1     8batch_B_2     9...我只想要来自数据batch_A_#,不管数量是多少。$ b( U. j4 l) g" x7 ~
如果我是用SQL可以使用编写的6 O: t. @( ^; q: F; X
select * where batch_name like 'batch_A_%'如果我是在R写下这一点,我可以用一些方法得到:grepl(),%in%或str_detect()
; L& Y, m& D' C, R7 E% R* o0 A* }# option 1subtable % select(batch_name,value) %>%    filter(grepl('batch_A_',batch_name,fixed = T))# option 2subtable % select(batch_name,value) %>%    filter(str_detect(batch_name,'batch_A_'))所有这些都将产生以下内容Postgres错误: HINT: No function matches the given name and argumenttypes. You might need to add explicit type casts
9 n* v4 J( k7 t" c( @: B" \因此,如何传递SQL帮助生成字符串函数或匹配函数dplyr SQL更灵活的函数范围可用于查询filter?# N1 {9 Y6 o4 h6 I* A
(仅供参考,%in%功能可以正常工作,但需要列出所有可能的值。可结合使用paste列出列表,但不适用于更一般的正则表达式)* V' a. F" R" N* K0 q
                                                               
  x' U. m# ?, u5 g" G    解决方案:                                                               
6 m( }) I# \/ Y4 A                                                                一个“ dplyr-only解决方案是这样的) n* S; z6 m" p" y* _, h- k; J, M
tbl(my_con,"my_table") %>%   filter(batch_name %like% "batch_A_%") %>%   collect()完整说明:/ K9 S! f: N* p% f# N  p+ x6 {
"my_table") %>%   filter(batch_name %like% "batch_A_%") %>%   collect()#> # A tibble: 3 x 2#>   batch_name value#> *       #> 1  batch_A_1     1#> 2  batch_A_2     2#> 3  batch_A_2     3dbDisconnect(my_con)#> [1] TRUE"my_table") %>%   filter(batch_name %like% "batch_A_%") %>%   collect()#> # A tibble: 3 x 2#>   batch_name value#> *       #> 1  batch_A_1     1#> 2  batch_A_2     2#> 3  batch_A_2     3dbDisconnect(my_con)#> [1] TRUE之所以可行,是因为dplyr所有不知道如何翻译的函数都会按原样传递。) h) ~5 g. x! L: ?3 }0 r1 Z$ d
?dbplyr::translate\_sql。9 i0 H6 Z+ l. d- ~' f5 s: G
帽尖到@PaulRougieux点击这里为他最近的评论
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则