【问题标题】:Use R variables to an SQL query [duplicate]将 R 变量用于 SQL 查询 [重复]
【发布时间】:2014-05-09 10:22:23
【问题描述】:

简而言之,我正在使用JDBC,并且我正在尝试编写一个查询,该查询将从 SQL 开发人员数据库表中返回一些值。

到目前为止,我有这个:

#Query for getting data
sql <- paste("select * 
           FROM GRID Z
           where Z.LAT = Xlat AND Z.LON = Xlon")
fun <- dbGetQuery(jdbcConnection, sql)
attach(fun)

问题是 XlatXlon 是 R 中的变量,它们的值经常变化,所以我不能真正将它们硬传递到查询中。显然,Z.LATZ.LON 对应于GRID 表。

问题是:是否可以在查询中使用 R 变量?

我还想知道是否有一些东西可以匹配最接近或最接近的值,而不是 =

感谢任何建议。谢谢

编辑:另一种方法是从我的桌子上SELECT *,然后与fun“玩”以获得我的价值观。对此有何想法或做法?

注意:jdbcConnection 正在请求远程连接。

【问题讨论】:

  • 现在消失的评论者是对的 - 为什么用 SQL Server 标记这个?或者,就此而言,oracle-sqldeveloper?没有“SQL 开发人员表”之类的东西:这显然是一个关于 Oracle 和 JDBC 的问题,因此将其标记为这样,总体而言,您将更快地获得相关答案。它还可以帮助任何寻求相同问题的人。
  • @StevePettifer 它的“sql developer db table”。注意分贝。这就是为什么人们可以编辑其他人的问题,以帮助他们做到这一点。他只是点击并继续。据我所知,这不合法
  • 仍然没有“sql developer db table”之类的东西,因为 SQL Developer 只是,IDE 不是 RDBMS。我同意他可以(并且应该)进行更多编辑或阐明,但他没有做任何“错误”的事情。您输入的信息(包括相关 RDBMS 的版本)越准确,答案就会越好(当然也更快)。
  • @StevePettifer 我几乎不知道每个 rdbms 的语法之间的差异,这是正常的。但是我知道有一些,这就是为什么我精确sql dev db table。 “他没有做任何'这样的错误'”没有意义。无论如何感谢您的反馈

标签: sql r oracle jdbc


【解决方案1】:

你在找这个吗?

sql <- paste0("select * 
           FROM GRID Z
           where Z.LAT ='", Xlat,"' AND Z.LON = '", Xlon,"'")

我假设您的变量是字符。如果以上内容在 Web 服务器后面运行,则可以使用 URL 编码和转义选项来避免代码注入……例如 this

编辑:关于这个:

I would also like to know if instead of = is there something to match the closest or nearest values.

由于您通过 SQL 引擎执行查询,因此它更像是一个 SQL 问题而不是 R 问题。就像@Vivek 说你可以在sqldf 中那样做,但我猜你的数据在远程数据库中,所以在这种情况下它不会有帮助。

所有 SQL 风格都有like,所以只需在查询中使用它。如果我误解了您的问题,请告诉我。

sql <- paste0("select * 
           FROM GRID Z
           where Z.LAT like '", Xlat,"' AND Z.LON like '", Xlon,"'")

【讨论】:

  • 是的,我要求远程连接。为什么sqldf 不起作用?不,你做对了。你能用like编辑你的答案吗?我对sql 语法和所有内容都不是很熟悉。非常感谢
  • sqldf 允许您将sql 语法用于R 对象。这意味着对象必须在 R 环境中,没有与远程 DBMS 的连接。
  • @KapelNick 编辑like
  • 它似乎工作正常,但是由于某种原因它没有返回任何值。
  • @KapelNick 这意味着可能没有数据。查询语法是正确的,但我可以说出查询的意义
【解决方案2】:

gsubfnfn$ 运算符支持类似 perl 的字符串插值,如下所示:

library(gsubfn)

sql0 <- "select * FROM GRID Z where Z.LAT = $Xlat AND Z.LON = $Xlon"
fun <- fn$dbGetQuery(jdbcConnection, sql0)

或这样允许在替换后检查sql

sql0 <- "select * FROM GRID Z where Z.LAT = $Xlat AND Z.LON = $Xlon"
sql <- fn$identity(sql0)
fun <- dbGetQuery(jdbcConnection, sql)

参见?fn 以及sqldf home page 上的示例。

【讨论】:

【解决方案3】:

是的,当然可以,请参阅库 sqldf。你可以使用近似匹配Z.LAT like 'Xlat'

data(CO2)

var1<-"Plant"
var2<-"conc"

require(sqldf)
squery2<-paste("select * from CO2 where",var1,"like 'Qn%'","and",var2,"> 500",sep=" ")

> sqldf(squery2)
  Plant   Type  Treatment conc uptake
1   Qn1 Quebec nonchilled  675   39.2
2   Qn1 Quebec nonchilled 1000   39.7
3   Qn2 Quebec nonchilled  675   41.4
4   Qn2 Quebec nonchilled 1000   44.3
5   Qn3 Quebec nonchilled  675   43.9
6   Qn3 Quebec nonchilled 1000   45.5

【讨论】:

  • 根据@Michele sqldf 需要在本地使用。我正在使用远程数据库,所以如果它是真的我不能真正使用它。我将编辑我的问题以反映这一点。谢谢
  • sqldf 演示是为了说明,我的意思是展示查询的构造,本地或远程数据库都一样
【解决方案4】:

你也可以使用这个 - 假设,

 Xlat <- 8
 Xlon <- 10

那么,

 #Query for getting data
 sql <- paste("select * 
       FROM GRID Z
       where Z.LAT = $Xlat AND Z.LON = $Xlon")
 fun <- dbGetQuery(jdbcConnection, sql)
 attach(fun)

【讨论】:

  • 你确定这样可以吗?在我看来 PHP 语法...
  • 恐怕这行不通。 $ 在 R 中有效,但 Sql 无法识别它..
  • sqldf 包文档说它可以工作 - code.google.com/p/sqldf 请参阅 - 示例 5。插入变量
  • 我尝试了$ 运算符,因此我知道事实并非如此。
  • @RHelp 在R(实际上)中做类似事情的唯一方法是使用sprintf。例如。 sprintf("%s %d", "test", 1:3)
猜你喜欢
  • 2011-05-18
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2021-10-27
  • 2021-01-09
  • 2017-05-02
  • 1970-01-01
相关资源
最近更新 更多