2014-11-05 5 views
0

plpgSql에서 빈 숫자 배열에 숫자를 추가해야합니다.이 빈 숫자 배열은 가변적입니다.빈 배열에 요소를 추가하십시오.

DECLARE 
    new_arr INTEGER[]; 
BEGIN 
    SELECT array_append(new_arr, 4) INTO new_arr; 

이 작동하지만, 나는 확실하지 않다,있을 수 있습니다이 더 나은 방법이 존재합니다

내가 뭘하면이 무엇입니까?

+2

'new_arr : = new_arr || 4 '는 아마 빠릅니다. http://adpgtech.blogspot.de/2014/11/assignment-beats-select-into.html –

+0

@ a_horse_with_no_name 감사합니다. – RIKI

+0

@a_horse_with_no_name : 아니요,이 경우는 같습니다. plpgsql 소스 코드를 찾습니다. Andrew의 측정은 정확하지만 조사가 잘못되었으며 의견도 나와 있습니다. 중요한 것 - 결과에 얼마나 많은 열이 있는지 - plpgsql은 실행 프로그램을 직접 호출 할 때, 더 많이 사용하면 SPI가 사용됩니다 (속도가 느림). –

답변

8

당신은 그것을 할 수 있지만,이 스타일은 조금 애매한

를 사용하여 A 할당 문입니다,하지만 당신은이 올바른 초기화를 잊지 필요가 없습니다. 귀하의 예제에서 new_arr은 빈 배열을 보유하지 않습니다. 그것은 NULL을 보유합니다. 수행 : 당신이 어떤 관계를 조회 할 경우

DECLARE new_arr int[] DEFAULT '{}'; 
BEGIN 
    new_arr := new_arr || 4; 
    -- or 
    new_arr := array_append(new_arr, 4); 

    -- both are equal 

SELECT INTO가 사용되어야한다.

+0

답변 주셔서 감사합니다 – RIKI

+0

이 답변으로 뭔가 이상한 것 같지 않습니다. 9.5.1에서,'RAISE NOTICE '배열 %은 길이가 %, new_arr, array_length (new_arr, 1);'prints'배열 {}은 길이가 '이다. 그래서 정말 빈 배열을 만들지, 그냥 일하는 다른 모호한 이유에 의존 하는가 아니면 array_length()의 버그입니까? – Neil

+0

할당 전에 'ASSERT new_arr IS NULL;'은 array_length()가 생각하는 것에도 불구하고 null이 아님을 의미합니다. – Neil

관련 문제