2013-06-13 7 views
2
WITH Dept(DName, HeadCount) AS (
    VALUES ('D1', 5), ('D2', 6), ('D3', 7) 
) 

Select array_agg(DName), array_agg(HeadCount) from Dept 

위의 쿼리가 생성됩니다.Postgres에서 테이블의 모든 열에 대한 배열 집계

"{D1,D2,D3}";"{5,6,7}" 

쿼리에서 일반적인 이름으로 열 이름을 언급하지 않고 동일한 출력을 생성 할 수있는 방법이 있습니까?

다음 쿼리에서 magic_function 대신 inbuilt 함수가 있습니까?

Select magic_function(*) from Dept 

또는 동적으로 필드 이름을 추출합니다 같은 INFORMATION_SCHEMA.COLUMNS으로 가입 등의 방법에 대한 라운드는있다.

답변

1

내가 아는 마법 기능이 없기 때문에 표준 Postgres에는 그러한 것이 없을 것입니다.

정보 스키마 또는 카탈로그 테이블은 예제에서 ad-hoc 행 유형에 도움이되지 않습니다. 그러나 당신은 아마 등록 된 행 유형을 사용하고이 경로를 제공하는 것 테이블,이 작업을 수행하기 위해 찾고 있습니다 :

WITH x AS (SELECT 'mytable'::regclass AS tbl) 
SELECT 'SELECT ' 
    || string_agg(format('array_agg(%I) AS %1$I_arr', a.attname), E'\n ,') 
    || E'\nFROM ' || tbl 
FROM x 
JOIN pg_attribute a ON a.attrelid = x.tbl 
WHERE NOT a.attisdropped -- no dropped (dead) columns 
AND a.attnum > 0  -- no system columns (you may or may not want this) 
GROUP BY x.tbl 

이 동적으로 적절한 SQL 문을 생성합니다.
테이블 이름을 regclass으로 변환하면 SQL 주입에 대해 안전합니다. 이 관련 대답 더 많은 설명 :
Table name as a PostgreSQL function parameter

결과 : 반환 형식뿐만 아니라 동적이므로 함수에서 동적 SQL과

SELECT array_agg(col1) AS col1_arr 
,array_agg("illegal nAmE") AS "illegal nAmE_arr" 
, ... 
FROM mytable 

전체 자동화, 쉬운 일이 아니다. 커서를 생성하여 반환 할 수 있지만 과장 될 수 있습니다.

+0

차갑다. 그것은 예상대로 작동합니다. Erwin에게 감사드립니다. – Gopal

관련 문제