是否有一种在数据库查询中使用REGEXP的方式?

时间:2017-09-14 21:57:58

标签: mysql r database dplyr

当我使用dplyr查询数据库时,我经常需要搜索字符串。通常,我使用%like%,它可以充分发挥作用。但有时候,我宁愿使用正则表达式。如果我正在编写纯SQL,我会写一些类似的东西:

select pidm, jobtitle from people
where jobtitle REGEXP "^Athl.*train"

但当然,我想写一个整洁的R:

foo  <- tbl(my_database,"people") %>%
   filter(jobtitle %regexp% "^Athl.*train") %>%
   select(pidm, jobtitle )

使用stringr::str_detect()在SQL中不起作用。有没有办法继续编写tidyverse风格的代码,但仍然进行正则表达式搜索?

如果重要,我的数据库将在MySQL上运行。

3 个答案:

答案 0 :(得分:2)

正确的dbplyr不支持stringr命令。我有PR,所以我们很快就会有这个。同时,您可以从INSTR内调用SQL本机命令,例如filter(),例如,您可以执行此操作:

foo  <- tbl(my_database,"people") %>%
           filter(instr("train", jobtitle)) > 0) %>%
           select(pidm, jobtitle )

答案 1 :(得分:2)

最新版本的docs walkthrough 1.2.0支持多种字符串函数,包括str_detect()。所以,@ wtmatthias回答现在有效。

flights_db %>% select(origin, flight) %>% filter(stringr::str_detect(origin, 'JF'))

答案 2 :(得分:0)

我可能错了,但似乎您可能在R中使用“旧”方法进行SQL查询。如果您还不知道, dbplyr 是有点新发布,你需要安装(install.packages("dbplyr"))&amp;用dplyr加载它。您应该能够在stringr::str_detect()内使用filter()。这个link应该为您提供dbplyr如何使用/ dplyr所需的所有信息,并允许我们习惯的更多tidyverse风格。关于MySQL的说明也在链接中。

一个简单的例子:

library(nycflights13)
library(dbplyr)

nycflights13_sqlite(path = "path/for/sqlite")
con <- DBI::dbConnect(RSQLite::SQLite(), path = "path/for/sqlite")
copy_to(con, nycflights13::flights, "flights")

DBI::dbGetQuery(con, "SELECT origin, flight 
            FROM flights WHERE origin like '%JF%'")

flights_db <- tbl(con, "flights")

flights_db %>% select(origin, flight) %>% filter(stringr::str_detect(origin, 'JF'))