簡體   English   中英

SQL “where”子句因 R JDBC HANA 連接而失敗

[英]SQL “where” clause failing with R JDBC HANA connection

我在通過 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。

可能它正在處理嵌入的引號括起來的字符串中的引號,而 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)

為了完成前面的答案(當然更可取,因為它使用綁定變量),這里描述了問題的*根本原因**:

在單引號字符串中使用single quote引號當然必須轉義

與使用雙引號ROracle escaping 相反,使用反斜杠。

即正確用法如下:

> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM