【问题标题】:using an R list in WHERE clause of SQL query在 SQL 查询的 WHERE 子句中使用 R 列表
【发布时间】:2019-08-03 10:20:37
【问题描述】:

我试图在 SQL 查询的 WHERE 子句中使用表中的值列表。具体来说,如果 pat_ids 是我的列表,例如pat_list= c('abc','xyz','123'),我尝试运行(在 R 中)

library('RODBC')
edw = odbcConnect('Teradata')
allVisit = sqlQuery(
    edw,
    "SELECT
        fe.*
        FROM edwcdm_pc_views.fact_encounter AS fe
            JOIN edwcdm_pc_views.fact_diagnosis AS fd on   fe.encounter_sk = fd.encounter_sk
        WHERE
        fe.Patient_Sk in paste("(",paste(pat_ids,collapse=","),")",sep="")
")

我收到错误“WHERE fe.Patient_Sk 中出现意外的字符串常量

我到底做错了什么?我没有将列表正确地重新格式化为 SQL WHERE 子句的字符串,还是尝试将 R 对象用作 SQL 查询术语的语法存在更根本的问题?

【问题讨论】:

  • 它是paste("SELECT ... (",paste(...),")")。您将查询的第一部分粘贴到第二部分。
  • 我想我不明白。您的建议(在 SELECT 之前粘贴)只会将整个查询转换为 R 字符串。
  • 没错。从 R 传递给 sqlQuery 的 SQL 是一个字符串。
  • 另外,Teradata 或 SQL 通常没有 paste 命令,这是一种 R 方法。发送到 Teradata 数据库引擎的所有内容都必须符合 Teradata 的 SQL 方言。请记住,有两种语言在这里工作:R 作为应用程序层,SQL 作为较低级别的数据库层。

标签: sql r teradata


【解决方案1】:

glue 包有个方便的函数glue_sql 解决了这个问题:

glue::glue_sql(
  "
  SELECT
    fe.*
  FROM 
    edwcdm_pc_views.fact_encounter AS fe
    JOIN edwcdm_pc_views.fact_diagnosis AS fd on fe.encounter_sk = fd.encounter_sk
  WHERE
    fe.Patient_Sk in ({pat_list*})
  ",
  .con = edw
)
#<SQL> SELECT
#  fe.*
#FROM 
#  edwcdm_pc_views.fact_encounter AS fe
#  JOIN edwcdm_pc_views.fact_diagnosis AS fd on   fe.encounter_sk = fd.encounter_sk
#WHERE
#  fe.Patient_Sk in ('abc', 'xyz', '123')

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 2016-10-30
    • 2011-12-03
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多