问题描述
为了检查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
。如果您执行半联接,则会发生这种情况。因此,如果您的应用程序可以使用半联接编写,则可以通过这种方式解决问题。