我有一个实用的SQL查询,该查询从如下所示的Oracle数据库中的两个相关表中提取数据(虚拟查询):
SELECT
OP.FIELD_1 AS "Trade Date",
L.FIELD_2 AS "Node ID"
FROM
TABLE_1 OP,
TABLE_2 L
WHERE
OP.FIELD_1 = '12-JAN-2019'
是否可以在ROracle框架内使用此查询?我无法使其正常工作,我不知道是否是因为不可能,我格式化查询的格式不正确,等等。我尝试了很多事情,但是这里有一个示例(虚拟查询) :
library(ROracle)
# Connect to database
con <- dbConnect(drv, username = "username",
password = "pass",
dbname = "database_name")
# Query the database
res <- dbSendQuery(con "SELECT OP.FIELD_1 AS Trade Date,
L.FIELD_2 AS Node ID
FROM TABLE_1 OP,
TABLE_2 L
WHERE OP.FIELD_1 = '12-JAN-2019'")
我的数据库连接工作正常,我可以从这些表之一查询,但不能以这种格式一起查询。任何帮助将不胜感激! ROracle文档仅包含非常简单的查询示例。
答案 0 :(得分:0)
因为对R字符串使用双引号,所以只需在列别名周围转义双引号。 Oracle在 Node ID 之间的空间抛出错误。
res <- dbSendQuery(con, "SELECT OP.FIELD_1 AS \"Trade Date\",
L.FIELD_2 AS \"Node ID\"
FROM TABLE_1 OP,
TABLE_2 L
WHERE OP.FIELD_1 = '12-JAN-2019'")
或者,将R字符串用单引号引起来并在WHERE
中转义单引号:
res <- dbSendQuery(con, 'SELECT OP.FIELD_1 AS "Trade Date",
L.FIELD_2 AS "Node ID"
FROM TABLE_1 OP,
TABLE_2 L
WHERE OP.FIELD_1 = \'12-JAN-2019\'')
还有,只是避免在Oracle中使用别名使用双引号的列别名中要避免空格:
res <- dbSendQuery(con, "SELECT OP.FIELD_1 AS Trade_Date,
L.FIELD_2 AS Node_ID
FROM TABLE_1 OP,
TABLE_2 L
WHERE OP.FIELD_1 = '12-JAN-2019'")
使用DBI::sqlInterpolate
甚至更好 parameterize进行查询,并避免任何引号引起来。与逗号分隔的表格相比,以下还使用CROSS JOIN
更明确,首选的版本:
library(ROracle)
library(DBI)
...
sql <- sqlInterpolate(con, "SELECT OP.FIELD_1 AS Trade_Date,
L.FIELD_2 AS Node_ID
FROM TABLE_1 OP
CROSS JOIN TABLE_2 L
WHERE OP.FIELD_1 = ?param",
param = "12-JAN-2019")
res <- dbGetQuery(con, sql)