2013-11-25 1 views
0

Как передать имя столбца в качестве параметра SQL в R sqldf?Как передать имя столбца в качестве параметра SQL в R sqldf?

Ни

q <- "Q10" 

A = fn$sqldf('SELECT * FROM Customer WHERE $q < 100') 

или

q <- "Q10" 

A = fn$sqldf('SELECT * FROM Customer WHERE '$q' < 100') 

работы.

+0

Определить «работы». Первый выглядит нормально, если Q10 является числовым столбцом в Customer. Предложите сделать свой пример воспроизводимым, предоставив 'dput (head (Customer))'. –

+0

Это строковый столбец. Имя столбца - «Q10». Я получаю сообщение об ошибке: Ошибка в источнике ("~/Paul/R/DTA/Success rate123_2.R", echo = TRUE): ~/Paul/R/DTA/Success rate123_2.R: 3: 63: непредвиденная строковая константа 2: q <- "Q10" 3: pred01 = fn $ sqldf ('SELECT * FROM CustomerQ_totals123T WHERE' $ q '<$ fract * Q9 AND Total> -1 ORDER BY Total DESC ' ^ – paulkp

+0

НИКАКИЕ из вышеуказанных работ – paulkp

ответ

1

Решение:

Вы можете использовать paste команду для конкатенации переменной и строки.

> library(sqldf) 
> my_names <- names(sqldf("select * from iris limit 10")) 
> sqldf(paste("select",my_names[1], "from iris limit 2", sep=" ")) 
     Sepal_Length 
1   5.1 
2   4.9 

или с помощью fn$ выполнить интерполяцию строки в последней строке могут быть написаны:

> fn$sqldf("select `my_names[1]` from iris limit 2") 

Потенциальные проблемы:

Названия могут быть разными, когда вы пытаетесь используйте sqldf для запроса. Например, имена по умолчанию для набора данных iris является:

> names(iris) 
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species" 

Однако имена должны быть отформатированы по-другому, когда вы пытаетесь использовать имена столбцов, чтобы сделать запросы:

> sqldf("select * from iris limit 1") 
    Sepal_Length Sepal_Width Petal_Length Petal_Width Species 
1   5.1   3.5   1.4   0.2 setosa  

Это official explaination:

Here is an example of sorting and limiting output from an SQL select statement on the iris data frame that comes with R. Note that although the iris dataset uses the name Sepal.Length the RSQLite layer converts that to Sepal_Length.

Так что причина в моей Soluti на я сначала создал переменную my_names от sqldf select statement вместо names(iris).

4

sprintf() будет работать очаровательно в этом случае. Лично я нахожу код, используя sprintf(), чтобы его было легче читать (и даже писать), чем paste().

q <- "Q10" 
sql <- sprintf("SELECT * FROM Customer WHERE %s < 100", q) 

sql 
[1] "SELECT * FROM Customer WHERE Q10 < 100" 

На самом деле, вы можете пойти гораздо дальше с компиляцией сложных SQL-запросов. Только для иллюстрации:

q <- "Q10" 
value <- "150" 
sql <- sprintf("SELECT * FROM Customer WHERE %s < %s", q, value) 

sql 
[1] "SELECT * FROM Customer WHERE Q10 < 150" 
+0

Я делаю 'sql <- sprintf (" SELECT * FROM a, b WHERE a.name =% s ", 'Leo'); DF <- sqldf (sql); '. Я получаю 'Ошибка в rsqlite_send_query (conn @ ptr, statement): нет такого столбца: Leo', хотя существует столбец« Leo' и команда 'sqldf (« SELECT * FROM a, b WHERE a.name = «Leo») 'работает независимо. Как вы думаете? Не могли бы вы прояснить свой ответ? - - Вам нужно 'sql <-" ... '% s' "'. Также здесь https://stackoverflow.com/a/36881772/54964 –

0

Для меня Sprintf является идеальным решением, вам необходимо изменить% s на% г для целых чисел я думаю.

q= 'Q10' ; value= 150 
sql <- sprintf("SELECT * FROM Customer WHERE %s < %d", q, value) 

sql 
[1] "SELECT * FROM Customer WHERE Q10 < 150" 

 Смежные вопросы

  • Нет связанных вопросов^_^