使用r和postgresql查询列表中的if值

z9zf31ra  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(290)

我有一个这样的Dataframe
df1型

ID  value
1   c(YD11,DD22,EW23)
2   YD34
3   c(YD44,EW23)
4

我想查询另一个数据库,告诉我有多少行有这些值。这最终将在一个循环中通过所有行完成,但现在我只想知道如何为一行完成它。
假设数据库如下所示:
sql数据库

value  data
YD11   2222
WW20   4040
EW23   2114
YD44   3300
XH29   2040

如果我只看第一行,我会得到:

dbGetQuery(con,
       sprintf("SELECT * FROM sql_database WHERE value IN %i", 
               df1$value[1]) %>%
  nrow()

OUTPUT:  
2

其他行是:
第2行:0
第3行:2
第4行:0
我不需要创建循环,但是因为我的代码不起作用,我想知道如何查询表中所有在r列表中有值的行。

7gcisfzg

7gcisfzg1#

你不需要for循环。

library(tidyverse)
library(DBI)
library(dbplyr)

df1 <- tibble(
  id = 1:4,
  value = list(c("YD11","DD22","EW23"), "YD34", c("YD44","EW23"), NA)
)

# creating in memory database table

df2 <- tibble(
  value = c("YD11", "WW20", "EW23", "YD44", "XH29"),
  data = c(2222, 4040, 2114, 3300, 2040)
)

con <- dbConnect(RSQLite::SQLite(), ":memory:")

# Add auxilary schema

tmp <- tempfile()
DBI::dbExecute(con, paste0("ATTACH '", tmp, "' AS some_schema"))
copy_to(con, df2, in_schema("some_schema", "some_sql_table"), temporary = FALSE)

# counting rows

df1 %>%
  unnest(cols = c(value)) %>%
  left_join(tbl(con, dbplyr::in_schema("some_schema", "some_sql_table")) %>% collect(), by = "value") %>%
  mutate(data = if_else(is.na(data), 0, 1)) %>%
  group_by(id) %>%
  summarise(n = sum(data))

相关问题