database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Tutorials 8577 게시물 읽기
No. 8577
배열 자료형 정렬 함수
작성자
김상기(ioseph)
작성일
2009-12-15 02:40ⓒ
2009-12-15 03:40ⓜ
조회수
8,884

정렬 함수 소스가 분실 되어 다시 만드려다 웹 페이지 검색으로 찾았습니다.
역시 저 보다 더 고민하고, 더 깔끔하게 만드는 사람들이 있었네요.
David Fetter라는 아저씨의 코드입니다. 물론 BSD 라이센스라 믿고, 올립니다.
출처: http://www.postgres.cz/index.php/PostgreSQL_SQL_Tricks
사용버전은 generate_series() 함수가 사용가능한 버전입니다.

CREATE OR REPLACE FUNCTION array_sort(anyarray)
  RETURNS anyarray AS
$BODY$
SELECT ARRAY(
    SELECT $1[s.i] AS "foo"
    FROM
        generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
    ORDER BY foo
);
$BODY$
  LANGUAGE 'sql' VOLATILE;
이 글에 대한 댓글이 총 1건 있습니다.

만일 8.4.x  버젼이라면

unnest 와 array_agg 를 지원합니다. (지원하지 않아도 쿼리로 해결할 수는 있씁니다만..)

그것을 활용하여도 될거 같습니다.

 

generate_series 로 배열 요소 각각을 떼어 내는것으로 unnest 를 활용하면 되고

떼어낸 배열을 다시 합치기 위해 array_agg 를 사용해도 될거 같습니다.

 

select array_agg(unnest)

from (select unnest(array['마', '가', '라'])

order by 1) as foo;                                                          
 array_agg 
------------
 {가,라,마}
(1 row)
 

함수로 만든다면 BODY 부분에

 

select array_agg(unnest) from (select unnest($1) order by 1) as foo; 또는 위의 모양으로

select ARRAY(select unnest from (select unnest($1) order by 1) as foo);

요로케 넣음 되겠지요

 틀린점이 있다면 generate_series 와 unnest 의 사용인데..

이 둘의 비용이 어떨게 다를지는..

 

tyro님이 2009-12-16 00:06에 작성한 댓글입니다.
이 댓글은 2009-12-25 12:31에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
9299plpgsql debuger 설치해서 사용하기
김상기
2013-06-19
4829
8971타임라인을 이용한 시간여행
김상기
2012-03-16
5725
88499.1 trgm 활용하기
신기배
2011-10-06
7182
8577배열 자료형 정렬 함수 [1]
김상기
2009-12-15
8884
7496엑셀 FORECAST 함수 구현하기
김상기
2008-08-14
15173
7068corr() 집계 함수
김상기
2007-03-01
11558
69948.2에서 새롭게 생긴 SQL 구문 [3]
김상기
2007-01-06
10978
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.073초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다