首页 > 解决方案 > SQL“where”子句因 R JDBC HANA 连接而失败

问题描述

我在通过 R 连接到我公司的 HANA 数据库时遇到了麻烦,但最终取得了突破,但是现在我的 sql 语句无法使用“where”语句对数据进行子集化。

以下返回跨 9 个变量的 10 个观测值的数据框

# Fetch all results
rs <- dbSendQuery(jdbcConnection, 'SELECT TOP 10 
VISITTYPE,
ACCOUNT,
PLANNEDSTART,
PLANNEDEND,
EXECUTIONSTART,
EXECUTIONEND,
STATUS, 
SOURCE, 
ACCOUNT_NAME
                  FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit"')

a <- dbFetch(rs)

但是,当我将 where 放入其中时,会收到错误消息。

rs <- dbSendQuery(jdbcConnection, 'SELECT TOP 10 
VISITTYPE,
ACCOUNT,
PLANNEDSTART,
PLANNEDEND,
EXECUTIONSTART,
EXECUTIONEND,
STATUS, 
SOURCE, 
ACCOUNT_NAME
                  FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit" WHERE VISITTYPE = ZR')

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
  Unable to retrieve JDBC result set for SELECT TOP 10 
VISITTYPE,
ACCOUNT,
PLANNEDSTART,
PLANNEDEND,
EXECUTIONSTART,
EXECUTIONEND,
STATUS, 
SOURCE, 
ACCOUNT_NAME
                  FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit" WHERE VISITTYPE = ZR (SAP DBTech JDBC: [260] (at 222): invalid column name: ZR: line 11 col 101 (at pos 222))

这是什么意思?ZR 不是列,它是列内的值。尝试将 ZR 放在引号中,但没有其他效果。

我的双引号和单引号语法基于我提出的另一个问题。

使用许多特殊字符将 R 连接到 HANA db 的问题

从来没有让它与 RODBC 一起工作,所以尝试了 JODBC。

标签: sqlrjdbc

解决方案


很可能它正在处理嵌入的引号括起来的字符串中的引号,而 SQL 中用于标识符的双引号符号使情况更加复杂。但是,请考虑参数化(在 R 等应用层中运行 SQL 时的行业最佳实践)以避免引号标点或连接的需要。与大多数 JDBC API 一样,RJDBC 支持参数化。另请注意,dbGetQuery大致等同于dbSendQuery+ dbFetch

sql <- 'SELECT TOP 10 VISITTYPE,
                      ACCOUNT,
                      PLANNEDSTART, 
                      PLANNEDEND,
                      EXECUTIONSTART,
                      EXECUTIONEND,
                      STATUS, 
                      SOURCE, 
                      ACCOUNT_NAME
         FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit" 
         WHERE VISITTYPE = ?'

param <- 'ZR'

df <- dbGetQuery(jdbcConnection, sql, param)

推荐阅读