2015-03-05 4 views
0

У меня есть база данных, которая содержит 16 столбцов. В 16 колонке у меня есть следующий текст:extract specific substring sql

ASN_MAF=0.09;DOMAINS=Pfam_domain:PF00168,Prints_domain:. 

Я хочу, чтобы извлечь PF00168, поэтому подстроку между Pfam_domain: и. Все строки имеют такой шаблон: Pfam_domain: и.

Я пытаюсь сделать этот запрос, но он не работает:

res = sqldf(" 
SELECT SUBSTRING(v16, CHARINDEX("Pfam_domain:",v16)+1, 10000), CHARINDEX(",",v16)-1) 
FROM GeminiTable_germ 
     ") 
+0

Что СУБД вы с помощью? – TZHX

+0

Я использую sqldf библиотеку в R, чтобы сделать запрос sql. Таким образом, у меня есть ошибка: «Ошибка в sqliteSendQuery (con, statement, bind.data): ошибка в инструкции: рядом с«) »: синтаксическая ошибка« – Anastasia

+0

Что именно вы хотите, вы можете опубликовать его. –

ответ

0

Предполагая, что мы хотим строку между двоеточием и запятой, instr(v16, ':')+1 - это позиция символа после двоеточия. Кроме того, нужная строка имеет длину instr(v16, ',') - instr(v16, ':')-1, так что используйте substr с теми 2-й и 3-й аргументы:

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") 
+0

Спасибо, что он работает! – Anastasia

1

Try:

SELECT SUBSTRING(v16, CHARINDEX('Pfam_domain:', v16)+12, CHARINDEX   
(',',v16) - (CHARINDEX('Pfam_domain:', v16)+12)) 

Обратите внимание, что я изменил ", чтобы" в заявлении SQL - это важный Различия в SQL.