문제

내가 가장 좋아하는 Postgres 골재 중 하나는 웹에서 찾을 수있는 악의적 인 증거에 따라 "IDOC의 Chris Rohlfs"에 기인 한 "목록"입니다.

CREATE FUNCTION comma_cat (text, text)
  RETURNS text AS
  'SELECT CASE
    WHEN $2 is null or $2 = '''' THEN $1
    WHEN $1 is null or $1 = '''' THEN $2
    ELSE $1 || '', '' || $2
  END'
LANGUAGE sql;

CREATE AGGREGATE list (BASETYPE = text, SFUNC = comma_cat, STYPE = text, INITCOND = '');

때로는 복제물을 제거하고 싶다는 것을 알게됩니다. an 오래된 메일 링리스트 스레드 이 접근법은 정렬을 할 수 없으며, 이는 복제 제거를위한 딜러 일 수 있습니다. 같은 스레드의 다른 게시물 같은 일을하는 함수를 제안합니다. 어쩌면이 목적을 위해 더 수정할 수 있습니까?

그 동안, 다른 언어로 출력을 마사지 할 것입니다. 그러나 Postgres에서 직접 이것을 할 수 있다면 멋질 것입니다!

도움이 되었습니까?

해결책

중간 배열을 사용할 수 있습니다.

CREATE OR REPLACE FUNCTION comma_cat(text[], text)
  RETURNS text[] AS
$BODY$
  SELECT
    CASE WHEN $1 @> ARRAY[$2] THEN $1
    ELSE $1 || $2
  END
$BODY$
  LANGUAGE 'sql' VOLATILE;

CREATE OR REPLACE FUNCTION comma_finish(text[])
  RETURNS text AS
$BODY$
    SELECT array_to_string($1, ', ')
$BODY$
  LANGUAGE 'sql' VOLATILE
  COST 100;

CREATE AGGREGATE list (BASETYPE = text, SFUNC = comma_cat, STYPE = text[], FINALFUNC = comma_finish, INITCOND = '{NULL, NULL}');

value    id
-------- --
"puer"   1
"socer"  2
"vesper" 3
"vesper" 4
"gener"  5
"asper"  6
"asper"  7
"miser"  8
"tener"  9
"liber"  10
"puer"   11

SELECT list(value)
FROM t_text

"puer, vesper, gener, asper, miser, tener, liber, socer"

다른 팁

집계 함수 호출 안에 "고유 한"예선을 넣을 수 있습니다. 중복을 제거 할 수 있습니다.

select list(distinct <column>)
from...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top