将R向量转换为字符串数组

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中无法运行。有没有办法使用粘贴命令来获取字符串?或者有更好的方法来实现我的目标吗?

3个回答

12

你需要使用 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' );"

那是一个更好的解决方案,加1! - Paul Hiemstra
这取决于操作系统。例如,在Windows下,默认情况下会得到不同的结果。 - Hong Ooi
@HongOoi 在我的 Linux 系统中,这不依赖于操作系统(至少我没有发现),但是对于不同的 shell(type 参数),建议使用不同的引号类型。在我的 Linux Box 中,我可以访问所有参数(我可以使用 type = "cmd")。我没有 Windows 机器来检查,但这很奇怪。 - dickoa
@HongOoi 编辑后指定了类型。现在,它是操作系统无关的。 - dickoa
看一下 shQuote 的代码。你会看到一个特定的检查,用于在 Windows 上设置 type 参数(如果它缺失)。当然,你可以通过 type 强制使用特定的引用样式,但这应该是明确的。 - Hong Ooi

1
你可以用双引号将单引号'包围起来,使其成为字符串的一部分:
vector = c("'a'","'b'", .....)

一个例子:

> vec = c("'a'", "'b'", "'c'")
> paste(vec, collapse = ', ')
[1] "'a', 'b', 'c'"

1

将向量放在引号中,然后再将其粘贴到查询中。

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

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

shQuote可以帮助你实现这个功能,但这是其本意的误用。它用于为操作系统 shell引用字符串,并不能保证默认选择符合数据库的期望。例如,在Windows上,它将所有内容都包裹在双引号中,这是cmd.exe期望的,但可能会破坏查询字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接