如何解决检查dbplyr是否存在记录
为了检查sql表中是否存在记录(例如“产品”),sql - Fastes way to determine if record exists中投票最高的答案建议使用
IF EXISTS (SELECT * FROM Products WHERE id = '?')
...
给出与sql数据库的连接con
,是否可以对表dplyr::tbl(con)
执行此类操作?当然,可以使用%>% dplyr::filter(id %in% !!x)
仅选择相关的行,并将结果与记录进行比较(此处为x
)。不过,这似乎效率很低。
解决方法
您引用的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存在,则返回1x1数据帧,如果ID不存在,则返回0x1数据帧。然后可以使用if(nrow(fetched_id) == 1){...
进行检查。
或者,您可能想看看DBI软件包中的dbExecute
。这使您可以将文本字符串从R传递到SQL。因此,您可以在R中创建一个事务性sql语句,然后将其传递给不带dbplyr的数据库。
最后一点说明,dbplyr确实将sql服务器转换为EXISTS
。如果您执行半联接,则会发生这种情况。因此,如果您的应用程序可以使用半联接编写,则可以通过这种方式解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。