2017-11-28 1 views
0

동일한 family_id를 공유하고 배열을 사용하여 dog_characteristics 테이블을 쿼리하는 모든 개에서 선언 된 배열을 작성하려고합니다.postgres의 where 절에서 선언 된 배열 변수를 호출하려면 어떻게해야합니까?

CREATE OR REPLACE FUNCTION update_dog_characteristics_guarantor_id() 
    RETURNS trigger AS $$ 
    DECLARE dog_ids INT[]; 

    BEGIN 
    SELECT id into dog_ids FROM dogs WHERE dogs.family_id = OLD.id; 
    IF ((OLD.family_id IS NOT NULL) && ((SELECT COUNT(*) FROM dog_ids) > 0)) THEN 
     UPDATE 
     dog_characteristics 
     SET 
     guarantor_id = NEW.guarantor_id 
     WHERE 
     dog_characteristics.account_id = OLD.account_id 
     AND dog_characteristics.dog_id IN ANY(dog_ids); 
     RETURN NULL; 
    END IF; 
    RETURN NULL; 
    END; 
$$ LANGUAGE plpgsql; 

내가 시도 무엇

AND dog_characteristics.dog_id = ANY(dog_ids); 
AND dog_characteristics.dog_id = ANY(dog_ids::int[]); 
AND dog_characteristics.dog_id IN (dog_ids::int[]); 
AND dog_characteristics.dog_id IN (dog_ids); 
AND dog_characteristics.dog_id IN (ARRAY(dog_ids)); 
AND dog_characteristics.dog_id IN ARRAY(dog_ids); 
AND dog_characteristics.dog_id IN implode(',', dog_ids); 

가장 일반적인 오류

ERROR: malformed array literal: "672" 
    DETAIL: Array value must start with "{" or dimension information. 
    CONTEXT: PL/pgSQL function update_dog_characteristics_guarantor_id() line 5 at SQL statement 
+1

'= ANY (dog_ids);'do work –

+0

이렇게하면 형식이 잘못된 배열 리터럴에 대한 오류가 발생합니다. 그것은 하나의 ID 만 반환하기 때문입니까? –

+0

나는 = dog_ids을 시도했는데 같은 오류로 실패합니다. –

답변

1

트리거 기능에 여러 오류가 있습니다.

dog_ids은 배열로 선언되므로 첫 번째 선택의 결과도 배열이어야합니다. 이를 수행하려면 조회에서 리턴 된 모든 ID를 집계해야합니다.

은 그래서 첫 번째 선택 사항이이 select count(*)을 사용할 수 없습니다, 배열 요소가있는 경우

select array_agg(id) --<< aggregate all IDs into an array 
    into dog_ids 
FROM dogs 
WHERE dogs.family_id = OLD.id; 

확인하는 것, 당신은 사용 array_length() 또는 cardinality()을 사용해야합니다.

&&

는 "AND"연산자 SQL 아닌 - 즉 AND의 - 그래서 if이어야 :

IF OLD.family_id IS NOT NULL AND cardinality(dog_ids) > 0 THEN 
    ... 
END IF; 

다음은 어레이 상태이어야 여기서

AND dog_characteristics.dog_id = ANY(dog_ids); 
관련 문제