설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


총 게시물 162건, 최근 0 건
   

array 데이타형에서 특정 값 삭제 및 고유한 값 갖고 오기

글쓴이 : 다빈아빠 날짜 : 2014-11-17 (월) 17:05 조회 : 6467
pgsql 의 강점중 하나가 array 타입이 있어 간단한 배열형 정보는 별도의 테이블 없이도 관리할 수 있다는것입니다.  

pgsql을 잘 모르시는 분을 위해 간단히 설명드리면
int, 나 char 와 같은 데이타 타입에 배열을 사용할 수 있습니다. integer[] 라고 하면 정수를 담는 배열이 varchar(32)[][] 와 같이하면 가변문자열의 데이타를 담을 수 있는 2차원 배열이 생성됩니다.

전 보통 간단한 옵션의 등록을 이 배열을 통해 많이 사용하는데
"tags" varchar(32)[] 이렇게 해놓고 array('휴가중','임원') 과 같이 사용하면 편합니다.
그런데 특정 값을 추가하는것은 array_append() 함수로 넣으면 되는데 특정값을 삭제하거나 중복된 값을 제거하고 반환하는 등의 전용 함수가 없어서 좀 불편하죠.

그래서 간단히 아래와 같이 만들어 사용중입니다.

배열에 특정 값을 추가하는 함수 

CREATE FUNCTION "public"."array_remove"(IN array_in _varchar, IN item varchar) RETURNS "_varchar" 
AS $BODY$SELECT
CASE
WHEN A.ra = '{}' THEN NULL
ELSE A.ra
END
FROM
(
SELECT ARRAY(
SELECT DISTINCT $1[s.i] AS "foo"
FROM GENERATE_SERIES(ARRAY_LOWER($1,1), ARRAY_UPPER($1,1)) AS s(i)
WHERE $2 != $1[s.i]
ORDER BY foo
) AS ra
) AS A;

$BODY$
LANGUAGE sql
COST 100
CALLED ON NULL INPUT
SECURITY INVOKER
VOLATILE;

사용법은 array_remove( tags , '임원') 이렇게 하면 tags 라는 배열에서 '임원' 이 삭제 됩니다.


중복된 값을 제거하고 배열 갖고오기 

CREATE FUNCTION "public"."array_unique"(IN anyarray) RETURNS "anyarray" 
AS $BODY$
  SELECT ARRAY(
    SELECT DISTINCT $1[s.i]
    FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
    ORDER BY 1
  );
$BODY$
LANGUAGE sql
COST 100
CALLED ON NULL INPUT
SECURITY INVOKER
VOLATILE;

사용법은 array_unique( tags ) 하면 중복된 값이 제거된 상태로 반환됩니다.


보통 특정한 값을 넣을 때 중복되지 않도록 넣을때 아래 같은 형태로 사용하면 됩니다.

tags = array_unique( array_append( tags , '휴가중' ))

이러면 기존에 '휴가중' 이라는 태그를 갖고 있는 사람은 중복되어 추가되지 않겠죠.


반가운 마음에 첫 팁을 올려 보았습니다.
시간될때 가끔 와서 올리도록 하겠습니다.


postyes 2014-11-17 (월) 17:35
완전히 이해하진 못했지만 뭔가 신기해 보이네요. 정보 감사합니다.
댓글주소
   

postgresdba.com