Return 来自 table 使用 SQL 的超过 1 种类型

Return more than 1 types from a table using SQL

我有一个table这样的

Type <- c("TEN_02","TEN_04","TEN_05",
          "JOS_01","JOS_02","JOS_03",
          "VIT_06","VIT_11","VIT_08")
Value <- c(5,8,9,11,8,4,6,6,7)
df <- data.frame(Type,Value) 

我正在尝试使用 sql 语句从此 table 中提取任何具有 TEN 和 VIT 的类型。

我可以使用 sqldf

为一种类型 return
library(sqldf)
df1 <- sqldf("SELECT * FROM df
             WHERE Type LIKE 'TEN%'")

但是,如果我需要传入一个变量 "TYPES",它有不止一种类型

TYPES <- 'TEN,VIT'

df1 <- sqldf("SELECT * FROM df
             WHERE Type LIKE ('",TYPES,"%')") 

我收到一个错误

Error in rsqlite_send_query(conn@ptr, statement) : 
  unrecognized token: "'"

我想要的输出是

    Type Value
  TEN_02     5
  TEN_04     8
  TEN_05     9
  VIT_06     6
  VIT_11     6
  VIT_08     7

有人能给我指出正确的方向吗?我想为此使用 SQL 而不是 dplyr 或 data.table 因为我想将逻辑应用于查询数据库。

你可以使用复合条件(OR 条件),例如

SELECT * FROM df
WHERE Type LIKE 'TEN%'
OR Type LIKE 'VIT%'

不知道 sqldf,但认为您可以根据此博客按照下面的方式进行操作 https://codywu2010.wordpress.com/2015/08/08/r-sqldf-select-with-condition-of-one-column-like-another-column/

df1 <- sqldf("SELECT * FROM df WHERE Type LIKE TYPES || '%' ") 

1) 首先用单引号将 TYPES 中的每个类型括起来 TYPESQ。现在从问题中的示例来看,类型似乎始终是 Type 中下划线之前的部分,因此从类型中提取该部分。 (问题中的类型总是 Type 字段的前 3 个字符也是这种情况,所以如果情况总是如此,那么我们可以通过使用 substr(TYPE, 1, 3) 代替更复杂的 substr(...) 显示的表达式。)现在使用 in 查找匹配项。在 sqldf 前面加上 fn$ 可以在 SQL 字符串中启用类似 perl 的 $ 字符串插值,这样我们就可以在适当的位置替换 TYPESQ

TYPESQ <- gsub("\b", "'", TYPES, perl = TRUE)
sql <- "select * from df where substr(Type, 1, instr(Type, '_') - 1) in ($TYPESQ)"
fn$sqldf(sql)

给予:

    Type Value
1 TEN_02     5
2 TEN_04     8
3 TEN_05     9
4 VIT_06     6
5 VIT_11     6
6 VIT_08     7

要查看字符串插值后生成的 SQL 语句:

fn$identity(sql)
## [1] "select * from df where substr(Type, 1, instr(Type, '_') - 1) in ('TEN','VIT')"

2) 另一种方法是根据类型创建数据框并将其连接到 df:

TypeDF <- read.table(text = TYPES, sep = ",", as.is = TRUE, col.names = "Type")
sqldf("select d.* 
       from df d 
       join TypeDF t on substr(d.Type, 1, instr(d.Type, '_') - 1) = t.Type")