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")
我有一个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
为一种类型 returnlibrary(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")