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

Zhe Zhang

我正在使用dplyr的自动SQL后端从数据库表查询子表。例如

my_tbl <- tbl(my_db, "my_table")

其中,my_table在数据库中的模样

batch_name    value
batch_A_1     1
batch_A_2     2
batch_A_2     3
batch_B_1     8
batch_B_2     9
...

我只想要来自的数据batch_A_#,而不管数量如何。

如果我是用SQL编写的,则可以使用

select * where batch_name like 'batch_A_%'

如果我是在R写入这一点,我可以用一些方法来得到这样的:grepl()%in%str_detect()

# option 1
subtable <- my_tbl %>% select(batch_name, value) %>%
    filter(grepl('batch_A_', batch_name, fixed = T))
# option 2
subtable <- my_tbl %>% select(batch_name, value) %>%
    filter(str_detect(batch_name, 'batch_A_'))

所有这些都会产生以下Postgres错误: HINT: No function matches the given name and argument types. You might need to add explicit type casts

因此,如何传递SQL字符串函数或匹配函数以帮助使生成的dplyr SQL查询能够使用更灵活的函数范围filter

(仅供参考,该%in%函数可以正常工作,但需要列出所有可能的值。可以结合使用paste列出一个列表,但不适用于更一般的正则表达式)

dpprdan


一个“ dplyr-only”解决方案是这样

tbl(my_con, "my_table") %>% 
  filter(batch_name %like% "batch_A_%") %>% 
  collect()

完整说明

suppressPackageStartupMessages({
  library(dplyr)
  library(dbplyr)
  library(RPostgreSQL)
})

my_con <- 
  dbConnect(
    PostgreSQL(),
    user     = "my_user",
    password = "my_password",
    host     = "my_host",
    dbname   = "my_db"
  )

my_table <- tribble(
  ~batch_name,    ~value,
  "batch_A_1",     1,
  "batch_A_2",     2,
  "batch_A_2",     3,
  "batch_B_1",     8,
  "batch_B_2",     9
)

copy_to(my_con, my_table)

tbl(my_con, "my_table") %>% 
  filter(batch_name %like% "batch_A_%") %>% 
  collect()
#> # A tibble: 3 x 2
#>   batch_name value
#> *      <chr> <dbl>
#> 1  batch_A_1     1
#> 2  batch_A_2     2
#> 3  batch_A_2     3

dbDisconnect(my_con)
#> [1] TRUE

之所以可行,是因为dplyr不知道如何翻译的所有函数都会照原样传递,请参见?dbplyr::translate\_sql

帽尖到@PaulRougieux为他最近的评论点击这里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在数据帧上应用过滤器函数

如何在数据库优先方法中配置全局查询过滤器?

R中的dplyr过滤器中的函数参数

在dplyr中编写作用域过滤器函数

R中函数内部的dplyr过滤器问题

函数 dplyr 中过滤器的意外行为

视图页面中的Django数据库过滤器

从数据库中删除,但该过滤器除外

如何从SQL where子句创建JavaScript函数,以将其作为谓词传递到JavaScript数组的过滤器函数中?

在函数中传递数据库连接

在单元测试中传递参数,在数据库 CRUD Laravel 中更新函数

在dplyr的summary函数中使用过滤器函数

如何在函数中将字符串传递给dplyr过滤器?

使用Django过滤器过滤数据库中的数据

在函数调用中执行过滤器

Matlab中的函数过滤器

过滤器函数中的类型错误

函数中的过滤器参数默认使 dplyr::filter() 不过滤任何内容

Laravel-创建用于过滤SQL数据库的AJAX过滤器

在数组数组上应用过滤器函数会在Scala中返回异常

函数中的可选过滤器参数,用于过滤或不过滤数据

在数据库中检查新警报的 Django 函数

页面过滤器未从数据库获取数据

R Shiny和dplyr:如果为过滤器提供输入值,则在应用过滤器时从数据库查询数据

在Shiny的反应函数中使用dplyr条件过滤器

嵌套列表中的Firebase实时数据库过滤器数据

对数据库中的数据放置多个过滤器

SQL-从合并查询过滤器获取数据库名称

函数中指定的参数自动传递给过滤器