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

标签 sql r postgresql dplyr

我正在使用 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 错误:提示:没有函数与给定的名称和参数类型相匹配。您可能需要添加显式类型转换

那么,如何传入 SQL 字符串函数或匹配函数来帮助生成的 dplyr SQL 查询能够在 filter 中使用更灵活的函数范围?

(仅供引用,%in% 函数确实有效,但需要列出所有可能的值。这可以与 paste 结合使用以生成列表,但不会在更一般的正则表达式中工作)

最佳答案


dplyr-only”解决方案就是这样

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

完整 reprex :

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 致敬对于他最近的评论 here

关于sql - 在数据库的 dplyr 过滤器函数中传递 SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38962585/

相关文章:

c# - 跳过/采用两个合并列表的策略

r - 从命令行更改 Sweave 驱动程序

R 在法线轴上绘制逻辑变换数据(逻辑变换)

Python - 're.sub' ed 字符串在放入 sqlalchemy db.execute 命令时仍然包含特殊字符

SQL 查询显示错误,同一张表上有多个连接

java - JPQL - 获取集合中最常见的项目

R创建列组合来自两列的信息

sql - PostgreSQL SELECT 必须跨多行匹配

ruby-on-rails - Rails/Postgres - 我需要什么类型的数据库锁?

如果不为空,mySQL 将文本添加到列中