2010-08-11 8 views
17

postgresql에 테이블이 있습니다. 다음 표 "동물"내 문제를 설명 할 것입니다 : postgresql에서 array_agg로 만든 텍스트 집계 정렬

name 
------ 
tiger 
cat 
dog 

지금은 다음 쿼리를 사용하고

:

SELECT 
    array_to_string(array_agg("name"), ', ') 
FROM 
    animals; 

결과가 "호랑이, 고양이, 개." 하지만 문자열로 변환되기 전에 집계를 정렬하고 싶습니다. 그래서 난을 기대하고있는 결과입니다

"cat, dog, tiger". 

그래서 문자열로 변환하기 전에 PostgreSQL의 8.4에서 문자열 배열을 정렬하는 방법에 대해 설명합니다. "name"행의 ORDER BY는 작동하지 않으며 기본 제공 정렬 함수는 정수 값만 처리합니다.

누구나 좋은 생각, 어떻게 이것을 순수한 SQL에서 해결할 수 있을까요? 리처드

답변

11

이 PostgreSQL의 9.0에서 사용할 수 :

http://www.postgresql.org/docs/9.0/static/release-9-0.html, 섹션 E.1.3.6.1.

SELECT array_agg(animal_name) 
FROM (
    SELECT "name" AS animal_name 
    FROM animals 
    ORDER BY "name" 
) AS sorted_animals; 
+0

이것은 할 것이다! 9.0에서 구현된다는 것을 알게되어 매우 기쁩니다. – Richard

0

당신이 문자열로 변환하기 전에 배열에 generate_series()를 사용 후 그 결과에 SELECT...ORDER BY (또는 SELECT의 내부 단지 둥지를) 할 봤어 많은 고맙습니다

?

+0

방금 ​​중첩했습니다. subselect는 내가 필요로했던 마술을했다. – Richard

3

매튜 우드의 대답은 귀하의 경우에 더 있지만 은, 여기에 배열을 정렬하는 방법 : 당신은 (어설픈이기는하지만) 문제를 해결할 수 같은 것을 할 수있는 한편

를 집계 PostgreSQL의 8.4 최대 :

SELECT array(
    SELECT unnest(array[3,2,1]) AS x ORDER BY x 
); 

그것은 또한 당신이 배열을 통해 "map" 같은 일을 할 수 있기 때문에 편리 할 수 ​​arrayunnest 기능을 알고 :

SELECT array(
    SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery 
); 

또 다시 PostgreSQL 8.4의 가격이 될 수 있습니다.

+0

큰 해결 방법은 명심하십시오. 고맙습니다. – Richard

39

PostgreSQL 9.0 and later를 들어, 집계 표현에 ORDER BY 절을 사용할 수 있습니다 :

SELECT 
    array_to_string(array_agg(name ORDER BY name), ', ') 
FROM 
    animals; 

또한, 특정 목적을 위해, 당신은 string_agg를 사용할 수있는 쿼리 단순화하기 위해 : 아직도

SELECT 
    string_agg(name, ', ' ORDER BY name) 
FROM 
    animals; 
+0

힌트를 보내 주셔서 감사합니다! – Richard

0

을, 버전 8.4의 경우 매튜 우드 (Matthew Wood)가 제안한 솔루션을 사용하여 외부 쿼리에서 그룹화해야 할 경우 내부 쿼리를 정렬해야 정렬이 일관성을 유지할 수 있습니다.

SELECT family, array_agg(animal_name) 
FROM (
    SELECT family, "name" AS animal_name 
    FROM animals 
    ORDER BY family, "name" 
) AS sorted_animals 
group by family;