【问题标题】:Applying regular expressions to SQL databases in R在 R 中将正则表达式应用于 SQL 数据库
【发布时间】:2020-04-16 19:33:36
【问题描述】:
tbl(db_name, "table_name")
tbl(db_name, "table_name") %>% show_query()
#> <SQL>
#> SELECT *
#> FROM "table_name"

我可以在数据库和表上使用 dplyr tbl() 函数而不会出现问题。当我调用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() 函数的情况下执行此操作,因为我希望所有事情都在服务器端完成。我正在使用(相对)大型数据库,将所有内容加载到内存中并不实用。

【问题讨论】:

标签: sql r dplyr teradata dbplyr


【解决方案1】:

你可以尝试使用SQL函数REGEXP_REPLACE()代替r函数gsub()

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

对于 PostgreSQL 数据库,只需 'REPLACE`

【讨论】:

  • asset_title 只是指我要替换的列吗?如果是这样,我尝试过,但得到相同的 expected something between ',' and the 'replace' keyword 类型错误。也许语法适用于 PostgreSQL 但不适用于 Teradata SQL?
  • 是的,你需要你的列名,而不是asset_title,固定
  • 对于 Teradata docs.teradata.com/reader/kmuOwjp1zEYg98JsB8fu_A/…,您需要 REGEXP_REPLACE@
猜你喜欢
  • 2010-12-19
  • 2016-11-18
  • 2022-01-06
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多