代码之家  ›  专栏  ›  技术社区  ›  Max

在SQL查询的WHERE子句中使用R列表

  •  0
  • Max  · 技术社区  · 6 年前

    我试图在SQL查询的WHERE子句中使用表中的值列表。具体来说,如果pat_id是我的列表,例如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="")
    ")
    

    我得到的错误是“意外的字符串常量,其中fe.Patient_Sk

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   dave-edison    6 年前

    胶水包有一个方便的功能 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')