我除了通过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)
但是,当我在其中放一个地方时,我收到一个错误。
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放在引号中没有其他影响。
我的双引号和单引号语法基于我问过的另一个问题。
Issues connecting R to HANA db with many special characters
从未使用过RODBC,所以尝试过JODBC。
类似,它是处理嵌入的用引号引起来的字符串中的引号,进一步复杂化的是SQL中用于标识符的双引号符号。但是,请考虑参数化(每当在诸如R之类的应用程序层中运行SQL时,行业最佳实践),以避免需要使用引号标点或串联。像大多数JDBC API一样,RJDBC支持parameterization。另请注意,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)
为了完成先前的答案(当然,它最好使用bind variables,因为这里是问题的根本原因**:)>
当然在单引号中使用single quote
必须是escaped
与Oracle
的使用双引号R
的转义相反,使用反斜杠。即正确的用法如下:
> df <- dbGetQuery(jdbcConnection, + 'select * from "DUAL" where "DUMMY" = \'X\'') > df DUMMY 1 X
使用双引号字符串的替代方式
> df <- dbGetQuery(jdbcConnection,
+ "select * from \"DUAL\" where \"DUMMY\" = 'X'")
> df
DUMMY
1 X