PostgreSQL "List"집계를 수정하여 복제물을 제거하십시오
-
05-09-2019 - |
문제
내가 가장 좋아하는 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...
제휴하지 않습니다 StackOverflow