我使用RPostgres和RPostgreSQL将NULL作为INSERT参数查询传递时遇到问题:
在PostgreSQL中:
create table foo (ival int, tval text, bval bytea);
Run Code Online (Sandbox Code Playgroud)
在R:
这有效:
res <- dbSendQuery(con, "INSERT INTO foo VALUES($1, $2, $3)",
params=list(ival=1,
tval= 'not quite null',
bval=charToRaw('asdf')
)
)
Run Code Online (Sandbox Code Playgroud)
但这会引发错误:
res <- dbSendQuery(con, "INSERT INTO foo VALUES($1, $2, $3)",
params=list(ival=NULL,
tval= 'not quite null',
bval=charToRaw('asdf')
)
)
Run Code Online (Sandbox Code Playgroud)
使用RPostgres,错误消息是:
错误:期待一个字符串
在RPostgreSQL下,错误是:
Run Code Online (Sandbox Code Playgroud)Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: invalid input syntax for integer: "NULL" )
替换NA对我来说没问题,但它不是一种解决办法 - 文字'NA'被写入数据库.
使用例如整数(0)给出相同的"期望字符串"消息.
解决不知道如何NULL
在 R 中表达 PostgresSQL 包能够成功转换的值的问题的一个选择是简单地不指定您希望其值出现NULL
在数据库中的列。
所以在你的例子中你可以使用这个:
res <- dbSendQuery(con, "INSERT INTO foo (col2, col3) VALUES($1, $2)",
params=list(tval = 'not quite null',
bval = charToRaw('asdf')
)
)
Run Code Online (Sandbox Code Playgroud)
当你想要col1
拥有NULL
价值的时候。当然,这假设col1
您的表中可以为空,但情况可能并非如此。