2016-09-07 2 views
4

내가 RPostgres 및 RPostgreSQL 사용하여 INSERT 매개 변수 쿼리로 NULL 전달에 문제가 있어요 :매개 변수 및 NULL

PostgreSQL의에서

: R에서

create table foo (ival int, tval text, bval bytea); 

:

이 작동 :

res <- dbSendQuery(con, "INSERT INTO foo VALUES($1, $2, $3)", 
        params=list(ival=1, 
           tval= 'not quite null', 
           bval=charToRaw('asdf') 
           ) 
        ) 

하지만이 경우 오류가 발생합니다 :

0 RPostgres를 사용
res <- dbSendQuery(con, "INSERT INTO foo VALUES($1, $2, $3)", 
        params=list(ival=NULL, 
           tval= 'not quite null', 
           bval=charToRaw('asdf') 
           ) 
        ) 

, 오류 메시지는 다음과 같습니다

Error in postgresqlExecStatement(conn, statement, ...) : 
RS-DBI driver: (could not Retrieve the result : ERROR: invalid input 
syntax for integer: "NULL" 
) 

대입 NA 나와 함께 잘 될 것이다, 그러나 그것은 워크되지 않습니다 :

Error: expecting a string

RPostgreSQL에서 오류입니다 around - 리터럴 'NA'가 데이터베이스에 기록됩니다.

정수 (0)는 "문자열 예상"메시지를 제공합니다.

+0

빈 목록을 사용하면 무엇이 쓰여 집니까? 숫자 (0) 또는 문자 (0)를 사용합니까? – Shape

+0

숫자 (0), 정수 (0), 문자 (0)과 같은 길이가 0 인 항목은 모두 동일한 오류를 트리거합니다. 숫자와 마찬가지로 (NA). – Jason

답변

3

PostgreSQL pacakge가 성공적으로 번역 할 수있는 R의 NULL 값을 명확하게 표현하는 방법을 모르는 문제는 데이터베이스에서 NULL이되고 싶은 열을 지정하지 않는 것입니다.

그래서 귀하의 예제에서 당신은이를 사용할 수 있습니다

res <- dbSendQuery(con, "INSERT INTO foo (col2, col3) VALUES($1, $2)", 
        params=list(tval = 'not quite null', 
           bval = charToRaw('asdf') 
         ) 
       ) 

당신이 NULL 값을 갖도록 col1을 할 때. 물론 테이블의 col1이 Null을 허용한다고 가정합니다. 이는 그렇지 않을 수도 있습니다.

+0

감사. 나는이 아이디어에 다가 가고 있었다.나는 ival, tval, 또는 bval 중 어느 것이 NULL인지, 그리고 둘 이상이 NULL 일 수 있는지 미리 알지 못한다. 따라서 동적 질의 구축은 다소 까다로울 것이다. 따라서 실제로 "드라이버 맵을 R NULL에서 DB NULL로 설정"옵션이 후드 아래에 숨겨져 있지 않으면 좋은 대안입니다. – Jason

2

도움 주셔서 감사합니다. 팀의 대답은 좋은 답변이며 정수 값을 잡으려고 사용했습니다. 나머지 부분에서는 다른 경로를 사용하여 대부분의 작업을 처리하는 PostgreSQL에 함수를 작성했습니다.

CREATE OR REPLACE FUNCTION add_stuff(ii integer, tt text, bb bytea) 
RETURNS integer 
AS 
$$ 
DECLARE 
    bb_comp bytea; 
    rows integer; 
BEGIN 
    bb_comp = convert_to('NA', 'UTF8'); -- my database is in UTF8. 
    -- front-end catches ii is NA; RPostgres blows up 
    -- trying to convert 'NA' to integer. 
    tt = nullif(tt, 'NA'); 
    bb = nullif(bb, bb_comp); 
    INSERT INTO foo VALUES (ii, tt, bb); 
    GET DIAGNOSTICS rows = ROW_COUNT; 
    RETURN rows; 
END; 
$$ 
LANGUAGE plpgsql VOLATILE; 

는 이제 RPostgres 소스에서 모양과는 좀 더 쉽게 NULL/NA를 처리 할 수 ​​있도록 쉬운 충분한 방법이 있는지 : 그것은 거의 같다. 아무도 그것을 생각하지 않았기 때문에 그것이 없어 졌으면 좋겠다. 너무 까다 롭지 않아서가 아니다. :)

"NA"라는 말 그대로 데이터베이스에 넣고 NULL/NA가 아닌 다른 단어 (예 : NA = "북미")를 의미하는 경우 "잘못된"대답을 줄 것입니다. 우리의 유스 케이스를 고려할 때, 그것은 매우 희박한 것 같다. 6 개월 후에 볼 수 있습니다.

0

당신은 당신의 삽입 성명에서 직접 NULLIF를 사용할 수 있습니다

res <- dbSendQuery(con, "INSERT INTO foo VALUES(NULLIF($1, 'NULL')::integer, $2, $3)", 
        params=list(ival=NULL, 
           tval= 'not quite null', 
           bval=charToRaw('asdf') 
           ) 
        ) 

작품을 NA으로뿐만 아니라.

관련 문제