4

我是 R 和 mySQL 的新手,想在 R 中运行以下 mysql 命令

query = "select x, y from table where z in ('a', 'b');"
sqlQuery(connection, query)

假设我有一个很长的可变长度向量。有没有可能做

vector = c('a','b', .....)
query = "select x, y from table where z in **vector**;"

我试过

query = paste("select x, y from table where z in (", paste(vector, collapse =', '), ");")

但我失去了括号中的引号,我得到了

query = "select x, y from table where z in (a, b);"

它不在 sqlQuery 中运行。有没有办法使用粘贴命令来获得一串字符串?还是有更好的方法来做我想做的事情?

4

3 回答 3

10

你需要使用shQuote

query <- paste("select x, y from table where z in (", paste(shQuote(vector, type = "sh"), 
         collapse = ', '), ");")
query
[1] "select x, y from table where z in ( 'a', 'b', 'c', 'd' );"
于 2013-07-10T05:46:13.457 回答
1

您可以包围'by"以使它们真正成为字符串的一部分:

vector = c("'a'","'b'", .....)

一个例子:

> vec = c("'a'", "'b'", "'c'")
> paste(vec, collapse = ', ')
[1] "'a', 'b', 'c'"
于 2013-07-10T05:45:08.960 回答
1

在将向量粘贴到查询中之前,请将其放在引号中。

vector <- paste0("'", vector, "'", collapse=", ")

query <- paste("select ....", vector, <etc>)

shQuote为您执行此操作,但这是对其目的的滥用。它用于引用OS shell的字符串,并且不能保证它的默认选择将是您的数据库所期望的。例如,在 Windows 上,它将所有内容都用双引号括起来,这是cmd.exe预期的,但可能会破坏查询字符串。

于 2013-07-10T06:02:21.627 回答