提取特定子字符串 sql
extract specific substring sql
我有一个包含 16 列的数据库。在第 16 列中,我有以下文本:
ASN_MAF=0.09;DOMAINS=Pfam_domain:PF00168,Prints_domain:.
我想提取PF00168,所以Pfam_domain:和,之间的子串。所有行都具有此模式:Pfam_domain: and ,.
我尝试执行此请求,但它不起作用:
res = sqldf("
SELECT SUBSTRING(v16, CHARINDEX("Pfam_domain:",v16)+1, 10000), CHARINDEX(",",v16)-1 )
FROM GeminiTable_germ
")
尝试:
SELECT SUBSTRING(v16, CHARINDEX('Pfam_domain:', v16)+12, CHARINDEX
(',',v16) - (CHARINDEX('Pfam_domain:', v16)+12))
请注意,我在 SQL 语句中将 " 更改为 ' - 这是 SQL 中的一个重要区别。
假设我们要的是冒号和逗号之间的字符串,instr(v16, ':')+1
就是冒号之后的字符位置。此外,我们想要的字符串的长度为 instr(v16, ',') - instr(v16, ':')-1
,因此将 substr
与第二个和第三个参数一起使用:
library(sqldf)
GeminiTable_germ <- data.frame(v16 =
"ASN_MAF=0.09;DOMAINS=Pfam_domain:PF00168,Prints_domain:.")
sqldf("select substr(v16, instr(v16, ':')+1, instr(v16, ',')-instr(v16, ':')-1) v16new
from GeminiTable_germ")
给予:
v16new
1 PF00168
我们也可以将其分解并改为这样写:
field <- function(x, from, to) {
from_pos <- sprintf("instr(%s, '%s')+1", x, from)
to_pos <- sprintf("instr(%s, '%s')-%s-2", x, to, from_pos)
sprintf("substr(%s, %s, %s)", x, from_pos, to_pos)
}
field('v16', ':', ',') # view generated code
fn$sqldf("select `field('v16', ':', ',')` v16new from GeminiTable_germ")
我有一个包含 16 列的数据库。在第 16 列中,我有以下文本:
ASN_MAF=0.09;DOMAINS=Pfam_domain:PF00168,Prints_domain:.
我想提取PF00168,所以Pfam_domain:和,之间的子串。所有行都具有此模式:Pfam_domain: and ,.
我尝试执行此请求,但它不起作用:
res = sqldf("
SELECT SUBSTRING(v16, CHARINDEX("Pfam_domain:",v16)+1, 10000), CHARINDEX(",",v16)-1 )
FROM GeminiTable_germ
")
尝试:
SELECT SUBSTRING(v16, CHARINDEX('Pfam_domain:', v16)+12, CHARINDEX
(',',v16) - (CHARINDEX('Pfam_domain:', v16)+12))
请注意,我在 SQL 语句中将 " 更改为 ' - 这是 SQL 中的一个重要区别。
假设我们要的是冒号和逗号之间的字符串,instr(v16, ':')+1
就是冒号之后的字符位置。此外,我们想要的字符串的长度为 instr(v16, ',') - instr(v16, ':')-1
,因此将 substr
与第二个和第三个参数一起使用:
library(sqldf)
GeminiTable_germ <- data.frame(v16 =
"ASN_MAF=0.09;DOMAINS=Pfam_domain:PF00168,Prints_domain:.")
sqldf("select substr(v16, instr(v16, ':')+1, instr(v16, ',')-instr(v16, ':')-1) v16new
from GeminiTable_germ")
给予:
v16new
1 PF00168
我们也可以将其分解并改为这样写:
field <- function(x, from, to) {
from_pos <- sprintf("instr(%s, '%s')+1", x, from)
to_pos <- sprintf("instr(%s, '%s')-%s-2", x, to, from_pos)
sprintf("substr(%s, %s, %s)", x, from_pos, to_pos)
}
field('v16', ':', ',') # view generated code
fn$sqldf("select `field('v16', ':', ',')` v16new from GeminiTable_germ")