[英]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 放在引號中,但沒有其他效果。
我的雙引號和單引號語法基於我提出的另一個問題。
從來沒有讓它與 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
引號當然必須轉義
與使用雙引號R
的Oracle 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.