使用SQL

时间:2017-07-06 15:36:36

标签: sql r sqldf

我有一张这样的表

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语句来提取任何类型的TEN&amp; VIT来自此表。

我可以使用sqldf

返回一种类型
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,因为我想将逻辑应用于查询数据库。

2 个答案:

答案 0 :(得分:2)

1)首先围绕TYPES中的每个类型,单引号为TYPESQ。现在从问题中的示例看,类型始终是Type中下划线之前的部分,因此从Type中提取该部分。 (也就是问题中的类型总是Type字段的前3个字符,所以如果总是如此,那么我们可以通过使用substr(TYPE, 1, 3)代替更复杂的{{1}来进一步简化显示的表达式。)现在使用substr(...)来查找匹配项。使用fn $对in进行前缀可以在SQL字符串中启用类似perl的$ string插值,以便我们可以在适当的位置替换sqldf

TYPESQ

,并提供:

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

在字符串插值后查看生成的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

2)另一种方法是从类型创建数据框并将其加入fn$identity(sql) ## [1] "select * from df where substr(Type, 1, instr(Type, '_') - 1) in ('TEN','VIT')"

df

答案 1 :(得分:0)

你可以使用复合条件(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 || '%' ")