Mysql 是否有dplyr方法在数据库查询中使用REGEXP?

Mysql 是否有dplyr方法在数据库查询中使用REGEXP?,mysql,r,database,dplyr,Mysql,R,Database,Dplyr,当我用dplyr查询数据库时,我经常需要搜索字符串。通常,我会使用%像%这样的方法,这样就足够了。不过,有时我宁愿使用正则表达式。如果我编写的是纯SQL,我会编写如下内容: select pidm, jobtitle from people where jobtitle REGEXP "^Athl.*train" 但当然,我想写一本tidyverse风格的R: foo <- tbl(my_database,"people") %>% filter(jobtitle %reg

当我用dplyr查询数据库时,我经常需要搜索字符串。通常,我会使用
%像%
这样的方法,这样就足够了。不过,有时我宁愿使用正则表达式。如果我编写的是纯SQL,我会编写如下内容:

select pidm, jobtitle from people
where jobtitle REGEXP "^Athl.*train"
但当然,我想写一本tidyverse风格的R:

foo  <- tbl(my_database,"people") %>%
   filter(jobtitle %regexp% "^Athl.*train") %>%
   select(pidm, jobtitle )
foo%
筛选器(作业标题%regexp%“^Athl.*列”)%%>%
选择(pidm、作业标题)
使用
stringr::str_detect()
在SQL中不起作用。有没有一种方法可以继续编写tidyverse样式的代码,但仍然执行regexp样式的搜索


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

我可能错了,但看起来您可能正在使用“旧”方法进行SQL查询w/in R。如果您还不知道,是新发布的,您需要安装(
install.packages(“dbplyr”)
)并用dplyr加载它。此时,您应该能够在
filter()
的内部使用
stringr::str_detect()
。这将为您提供有关
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'))
库(nycflights13)
图书馆(dbplyr)
nycflights13_sqlite(path=“path/for/sqlite”)
con%过滤器(stringr::str_detect(原点,'JF'))

我可能错了,但看起来您可能正在使用“旧”方法进行SQL查询w/in R。如果您还不知道,是新发布的,您需要安装(
install.packages(“dbplyr”)
)并用dplyr加载它。此时,您应该能够在
filter()
的内部使用
stringr::str_detect()
。这将为您提供有关
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'))
库(nycflights13)
图书馆(dbplyr)
nycflights13_sqlite(path=“path/for/sqlite”)
con%过滤器(stringr::str_detect(原点,'JF'))

这是正确的
dbplyr
还不支持
stringr
命令。我有公关,所以我们希望很快就能做到。同时,您可以从
filter()
中调用SQL本机命令,如
INSTR
,例如,您可以执行以下操作:

foo  <- tbl(my_database,"people") %>%
           filter(instr("train", jobtitle)) > 0) %>%
           select(pidm, jobtitle )
foo%
过滤器(仪表(“列车”,工作标题))>0]>%
选择(pidm、作业标题)

这是正确的
dbplyr
还不支持
stringr
命令。我有公关,所以我们希望很快就能做到。同时,您可以从
filter()
中调用SQL本机命令,如
INSTR
,例如,您可以执行以下操作:

foo  <- tbl(my_database,"people") %>%
           filter(instr("train", jobtitle)) > 0) %>%
           select(pidm, jobtitle )
foo%
过滤器(仪表(“列车”,工作标题))>0]>%
选择(pidm、作业标题)
最新版本的1.2.0支持多个stringr函数,包括str_detect()。所以,@wtmatthias的答案现在起作用了

flights_db %>% select(origin, flight) %>% filter(stringr::str_detect(origin, 'JF'))
最新版本的1.2.0支持多个stringr函数,包括str_detect()。所以,@wtmatthias的答案现在起作用了

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

嗯,我的数据库似乎无法做到这一点——当我尝试编写类似的代码,甚至在我的服务器上使用您的示例时,我也会遇到类似的错误(我遇到一个错误:stri_detect_regex中的错误(string,pattern,opts_regex=opts(pattern)):对象“origin”未找到我是个白痴。重现了相同的问题。我将当前打开的PR读取为已提交。在当前版本下,看起来像
stringr
仍然不支持w/
dplyr
。(尽管基于该PR,它看起来可能已关闭)。抱歉!我要删除答案,因为它与我的数据库无关。嗯。我似乎无法让它与我的数据库一起工作——当我尝试编写类似的代码时,甚至在我的服务器上使用您的示例时,我也会遇到类似的错误(我遇到一个错误:stri_detect_regex中的错误(字符串,模式,opts_regex=opts(模式)):对象“origin”未找到我是个白痴。重现了相同的问题。我将当前打开的PR读取为已提交。在当前版本下,看起来像
stringr
仍然不支持w/
dplyr
。(尽管基于该PR,它看起来可能已关闭)。抱歉!将删除答案,因为它不相关。请注意,截至2018年6月6日,dbplyr中存在
stringr::str_detect()
支持,但至少对于包括MySQL在内的多个数据库,它有一个错误,该错误颠倒了参数,因此该模式被用作要在其中搜索的字符串(请参阅)。这是由开发版本中尚未达到CRAN的版本修复的。@crazybilly根据Hadley的说法,该函数从未正确工作过,并且该函数在dbplyr 1.4.0中不再可用。请注意,截至2018年6月6日,
stringr::str_detect()
dbplyr中存在支持,但至少对于包括MySQL在内的多个数据库,它有一个错误,该错误颠倒了参数,因此该模式被用作要在其中搜索的字符串(请参阅)。这是由开发版本中尚未达到CRAN的版本修复的。@crazybilly根据Hadley的说法,该函数从未正确工作过,并且该函数在dbplyr 1.4.0中不再可用