dplyr + RPostgreSQL字符串匹配区分大小写

时间:2018-08-27 22:11:15

标签: r dplyr rpostgresql

我不知道如何使用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

有人知道解决方法吗?

1 个答案:

答案 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运算符的版本。