我不知道如何使用dplyr
将不区分大小写的过滤器查询应用于远程PostgreSQL表。演示:
require(dplyr)
require(stringr)
require(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="mydb", host="localhost", port=5432, user="username")
# create db table
copy_to(con, iris, "iris", temporary = FALSE)
# dplyr remote database table
iris_pg <- tbl(con, "iris")
iris_pg %>% filter(str_detect(Species, 'setosa')) %>% head(3) %>% collect()
# A tibble: 3 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
* <dbl> <dbl> <dbl> <dbl> <chr>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
iris_pg %>% filter(str_detect(Species, 'Setosa')) %>% head(3) %>% collect()
# A tibble: 0 x 0
要忽略大小写stringr::fixed('Setosa', ignore_case=TRUE)
可以进行小波过滤。但是对于postgres表却没有效果:
iris_pg %>% filter(str_detect(Species, stringr::fixed('SETOSA', ignore_case=TRUE))) %>% head(3) %>% collect()
# A tibble: 0 x 0
有人知道解决方法吗?
答案 0 :(得分:2)
它不起作用,因为您可以看到here,在使用PostgreSQL后端时,dbplyr
依赖于区分大小写的函数STRPOS
来将str_detect
转换为SQL
一些可能的解决方法:
1)filter(str_detect(tolower(myvar), tolower(pattern)))
可能适用于任何关系数据库。
2)filter(myvar %~*% pattern)
依赖于~*
,它是不区分大小写的POSIX正则表达式的PostgreSQL运算符。
3)filter(myvar %ilike% paste0("%", pattern, "%"))
依赖于ILIKE
,它是不区分大小写且特定于Postgres的标准LIKE
运算符的版本。