SQL“ where”子句因R JDBC HANA连接而失败

问题描述 投票:0回答:2

我除了通过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 jdbc
2个回答
1
投票

类似,它是处理嵌入的用引号引起来的字符串中的引号,进一步复杂化的是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)

0
投票

为了完成先前的答案(当然,它最好使用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
© www.soinside.com 2019 - 2024. All rights reserved.