R RODBC помещает список чисел в оператор IN () - PullRequest
5 голосов
/ 27 декабря 2011

Я уже смотрел на переменную ' Pass R в sqlQuery RODBC с несколькими записями? ', но, похоже, она не работает. Я пытаюсь сделать sqlQuery() из R на БД SQL Server 2008 R2. Я пытаюсь получить образец из большой базы данных на основе номеров строк. Сначала я создал список случайных чисел:

sampRowNum <- sample(seq(1,100000,1), 5000)

Затем я пытаюсь использовать эти числа в запросе, используя:

query1 <- sqlQuery(channel, paste("select *      
  FROM db where row_id in (", sampRowNum,")", sep=""))

Я получаю только результаты из БД, где row_id равно первому числу в sampRowNum. Есть предложения?

1 Ответ

8 голосов
/ 27 декабря 2011

Вы не paste правильно формулируете свой запрос.

Если вы выполните оператор paste изолированно, вы увидите, что вы получите вектор длиной 5000, поэтому sqlQuery выполняет только первый из них, соответствующий первому элементу в samRowNum.

То, что вы хотите сделать, это что-то вроде этого:

paste("select * FROM db where row_id in (", 
    paste(sampRowNum,collapse = ","),")", sep="")

Точно так же, как добавленная заметка (и так как мне приходилось много чего делать, например ...), создание sql-запросов с предложением IN со строками - это немного больше неудобства, так как вам нужно придерживаться на все одинарные кавычки:

vec <- letters[1:5]

paste("SELECT * FROM db WHERE col IN ('",
    paste(vec,collapse = "','"),"')",sep = "")

[1] "SELECT * FROM db WHERE col IN ('a','b','c','d','e')"

Если вы будете делать это много, то в конечном итоге вы напишете небольшую функцию, которая сделает это для вставки векторов символов.

Как всегда, такого рода манипуляции со строками SQL не подходят, если вы работаете с пользовательским вводом (например, в веб-приложении) из-за атак с использованием SQL-инъекций. В моей конкретной ситуации это не сильно беспокоит, но в целом люди предпочитают параметризованные запросы, если вы не имеете большого контроля над входными значениями.

...