我有一张这样的表
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,因为我想将逻辑应用于查询数据库。
答案 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 || '%' ")