복붙노트

[SQL] 배열 인수 여러 번에 집합을 반환하는 함수를 호출

SQL

배열 인수 여러 번에 집합을 반환하는 함수를 호출

이것은 여러 번 호출되는 여러 열을 반환 plpgsql 기능의 변형이다. 그러나, 나는 상황 내 특정 세트에 대한 해결책을 찾기 위해 기대했다.

I는 주어진 파라미터 행의 배열을 처리하고, 새로운 행 + 칼럼들의 세트를 리턴하는 기능을 갖는다.

CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...

이 함수는 데이터의 1 세트와 테스트 케이스 작동

SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 

하지만 기능에 dataid를 통과하지 않고는, 데이터의 여러 그룹으로 작동하게하고 싶습니다. 나는 변형의 숫자를 시도했다 :

SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid

그러나이 기능은 모든 열에 대해 한 번 호출됩니다.

해결법

  1. ==============================

    1.포스트 그레스 9.3 년 이상, 그것은 LEFT 사실 ON ... 측면 가입 사용하는 것이 일반적으로 가장 좋습니다 :

    포스트 그레스 9.3 년 이상, 그것은 LEFT 사실 ON ... 측면 가입 사용하는 것이 일반적으로 가장 좋습니다 :

    SELECT sub.dataid, f.*
    FROM  (
       SELECT dataid, array_agg(data) AS arr
       FROM   dataset
       WHERE  dataid = something
       GROUP  BY 1
       ) sub
    LEFT   JOIN LATERAL foo(sub.arr) f ON true;
    

    함수 foo는 ()가 더 행을 반환 할 수없는 경우가 조인의 왼쪽에 모든 행을 보존로, 그 어떤 행이 오른쪽으로 반환되지 않습니다 경우에도 안전한 형태입니다.

    그 밖에, 또는 측면 조인에서 결과없이 행을 제외 할 경우, 사용 :

    CROSS JOIN LATERAL foo(sub.arr)
    

    또는 속기 :

    , foo(sub.arr)
    

    설명서에 명시 적 언급이있다.

    (다니엘에 의해 참조) 크레이그의 관련 답변은 그에 따라 업데이트됩니다 :

  2. ==============================

    2.이 함수는하지만 때문에 FUNC (). * 구현 방법 때문이 아니라 그 입력의 맥락에서 여러 번 호출

    이 함수는하지만 때문에 FUNC (). * 구현 방법 때문이 아니라 그 입력의 맥락에서 여러 번 호출

    이것은에 설명되어 있습니다 : 어떻게 SQL 쿼리에서 (FUNC ()). * 구문을 사용하여 여러 기능 evals을 피하기 위해?

    다음의 변형이 지원되는 모든 PostgreSQL의 버전 (8.4 이상)에 여러 evals없이 작동합니다 :

    WITH subq as (
      SELECT array_agg(data) as agg,
       dataid FROM datatable
       -- WHERE clause ?
       GROUP BY dataid)
    SELECT foo(agg,dataid) FROM subq;
    
  3. from https://stackoverflow.com/questions/26107915/call-a-set-returning-function-with-an-array-argument-multiple-times by cc-by-sa and MIT license