r - 使用odbc/dbplyr时如何按日期+常量过滤?更新问题

标签 r dplyr odbc teradata dbplyr

我之前运行过一个代码来查询 Teradata 服务器,但该服务器在更新 R 和所需的软件包后不再运行。

该问题似乎与 as.Date("X") 如何转换为 SQL 有关。 使用 show_query(),在之前的版本中,它的形式为 CAST("X"AS DATE),现在为 SELECT DATE "X",在尝试提取数据时会引发错误。

我知道它与更新有关,因为代码仍然在运行旧版本并查询同一服务器的虚拟机上运行。

下面是两个查询的比较。

示例:

   library (dplyr)
   library (DBI)
   library (odbc)
   connection <- dbConnect(odbc(), "Teradata")

   tbl(connection, "Teradata_table") %>% 
   head() %>% 
   select(POSIXct_POSIXt_var) %>% 
   mutate(date_var= as.Date(POSIXct_POSIXt_var)) %>% 
   show_query()

出现之前:

   <SQL>
   SELECT "POSIXct_POSIXt_var", CAST("POSIXct_POSIXt_var" AS DATE) AS "date_var"
   FROM (
     SELECT TOP 6 *
     FROM "Teradata_table"
   ) "q01"
   

使用相同的代码现在会产生:

   <SQL>
   SELECT TOP 6 "POSIXct_POSIXt_var", DATE "POSIXct_POSIXt_var" AS "date_var"
   FROM "Teradata_table"

后者的问题是,当尝试使用 as.data.frame()as_tibble() 提取数据时,它会抛出错误。

   tbl(connection, "Teradata_table") %>% 
   head() %>% 
   select(POSIXct_POSIXt_var) %>% 
   mutate(date_var = as.Date(POSIXct_POSIXt_var)) %>% 
   as_tibble()

(-3706)Syntax error: expected something between the word 'POSIXct_POSIXt_var' and the 'AS' keyword.

在提取数据之前,我需要进行大量数据过滤,但我一直坚持这一点,我想知道是否有其他人意识到这一点并有解决方案。我在网上找不到任何相关讨论。

版本更新自:

R 4.2 至 4.3 dplyr 1.0.10 至 1.1.2 dbplyr 2.2.1 至 2.3.2 odbc 1.3.3 至 1.3.4 DBI同1.1.3

最佳答案

如果您更喜欢CAST("X"AS DATE),那么您可以编写:

tbl(connection, "Teradata_table") %>% 
   head() %>% 
   select(POSIXct_POSIXt_var) %>% 
   mutate(date_var = sql('CAST("POSIXct_POSIXt_var" AS DATE)')) %>% 
   collect()

The problem with the latter is that it throws an error when trying to pull the data with as.data.frame() or as_tibble().

这可能只是因为在执行这些命令之一之前不会评估查询。使用 collect()compute() 实现相同的效果(后者将数据保存在数据库中)。

关于r - 使用odbc/dbplyr时如何按日期+常量过滤?更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76282760/

相关文章:

r - 扩展 R S4 对象以具有新插槽并保持原始对象以相同方式工作

r - 使用 R 中的正则表达式将所有匹配项提取到新列

java - 如何在java odbc中编写 "select column name as "别名“来自表名”

mysql - MS Access + ODBC 8.0 + MySQL 某些字段显示前 10 行 =0,但 MySQL 显示其他值

php - 在 Sybase SQLAnywhere 中插入或更新

r - 寻找曲线以匹配数据

html - Knitr,转换为base64和CSS样式

r - 绘制预测值和实际值

运行多个模型并将模型比较结果保存在 r 中的数据框中

r - 在 `dplyr` 动词 : `select` and `arrange` working differently 中使用不带引号的字符串