首页 > 解决方案 > 在 R 中将正则表达式应用于 SQL 数据库

问题描述

tbl(db_name, "table_name")
tbl(db_name, "table_name") %>% show_query()
#> <SQL>
#> SELECT *
#> FROM "table_name"

tbl()我可以在数据库和表上使用 dplyr函数而不会出现问题。当我调用该show_query()函数时,我可以看到它tbl()正在后台执行一个简单的 SQL 查询。如上所示。

下面显示的是当我尝试应用正则表达式并使用 dplyr 和 R(也许 dbplyr 也可以?)改变列时得到的错误。仅供参考,这是在 Teradata 数据仓库中执行的。

tbl(db_name, "table_name") %>% 
  mutate(col1 = gsub("^0+(?!$)", "", col1))
#> Error in new_result(connection@ptr, statement) : 
#>  nanodbc/nanodbc.cpp:1000: 22800: [Teradata][ODBC Teradata Driver]
#>  [Teradata Database](-8607)Syntax error: expected something between '(' and 
#>  the string '^0+(?!$)'.

如果我show_query()可以看到它gsub()是如何应用的,我猜这是不正确的 SQL 语法。

tbl(db_name, "table_name") %>% 
  mutate(col1 = gsub("^0+(?!$)", "", col1)) %>% 
  show_query()
#> <SQL>
#> SELECT "Plant_Material_Id", 
#>        "Plant_Id_In_Source", 
#>        gsub('^0+(?!$)', '', "col1") AS "col1", 
#>                                        "col2",
#>                                        "col3"        
#>                                              
#> FROM "table_name"

如何在 SQL 数据库(在这种情况下特别是 Teradata)上使用 R 中的正则表达式对列进行变异?

我还应该提到我想在不使用该collect()功能的情况下执行此操作,因为我希望一切都在服务器端完成。我正在使用(相对)大型数据库并将所有内容加载到内存中并不实用。

标签: sqlrdplyrteradatadbplyr

解决方案


您可以尝试使用 SQL 函数REGEXP_REPLACE()而不是 r 函数gsub()

tbl(db_name, "table_name") %>% 
  mutate(col1 = REGEXP_REPLACE(col1, "^0+(?!$)", "" ))

对于 PostgreSQL 数据库,只需“替换”


推荐阅读