【问题标题】:Check if record exists with dbplyr使用 dbplyr 检查记录是否存在
【发布时间】:2021-02-21 19:05:59
【问题描述】:

为了检查 SQL 表中是否存在记录(比如“产品”),sql - Fastes way to determine if record exists 中投票最多的答案建议使用

IF EXISTS (SELECT * FROM Products WHERE id = '?') 
...

给定con 到 SQL 数据库的连接,有没有办法对表 dplyr::tbl(con) 执行这样的操作?当然可以使用%>% dplyr::filter(id %in% !!x) 仅选择相关行并将结果与​​记录进行比较(此处为x)。不过,这似乎效率低下。

【问题讨论】:

    标签: sql r dplyr dbplyr


    【解决方案1】:

    您引用的IF EXISTS ... 行是事务性sql 语句的一部分,而不是从表中获取数据的纯查询。我还没有找到任何方法让dbplyr 翻译事务性 sql 语句,只有查询。一般来说,如果使用dbplyr,我会使用 R 作为控制语句而不是事务 sql。

    我会建议与您链接的问题中接受的答案一致:

    id_to_find <- 1234
    remote_table <- dplyr::tbl(db_connection, from = tbl_name)
    
    # create query
    fetched_id <- remote_table %>%
      filter(id == id_to_find) %>%
      select(id) %>%
      head(1)
    
    # validate query
    show_query(fetched_id)
    
    # fetch result into R
    fetched_id <- fetched_id %>%
      collect()
    

    如果 id 存在,这将返回给 R 一个 1x1 数据帧,如果它不存在,则返回一个 0x1 数据帧。然后可以使用if(nrow(fetched_id) == 1){... 进行检查。

    或者,您可能想查看 DBI 包中的 dbExecute。这使您可以将文本字符串从 R 传递到 SQL。因此,您可以在 R 中创建一个事务性 sql 语句并将其传递给数据库,而无需 dbplyr。

    最后一点,dbplyr 确实为 sql server 提供了EXISTS 的翻译。如果您执行半联接,则会发生这种情况。因此,如果您的应用程序可以使用半联接编写,您也许可以通过这种方式解决问题。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 2015-01-21
      • 2012-08-13
      • 2015-01-02
      • 1970-01-01
      相关资源
      最近更新 更多