가끔 배열을 그냥 읽는 것만이 아니라, 값을 추가하거나, 오래된 값을 지우거나, 내용을 업데이트해야 할 때가 있어. 다행히도 PostgreSQL에는 이런 걸 쉽게 해주는 함수들이 있어. 배열을 직접 다시 쓰지 않아도 array_append()랑 array_remove()로 배열 내용을 쉽게 관리할 수 있어. 어떻게 쓰는지 같이 보자.
array_append()로 배열에 요소 추가하기
array_append() 함수는 배열 맨 끝에 새로운 요소를 추가할 때 써. 이 함수는 두 개의 인자를 받아:
- 수정하려는 원본 배열
- 배열에 추가하고 싶은 값
예시 1: 간단한 숫자 배열
예를 들어, projects라는 테이블에 team_members라는 컬럼이 있고, 여기에 프로젝트에 참여하는 유저들의 id 배열이 들어 있다고 해보자.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- 몇 개의 행을 추가해보자
INSERT INTO projects (name, team_members)
VALUES
('프로젝트 A', ARRAY[1, 2, 3]),
('프로젝트 B', ARRAY[4, 5]);
이제 "프로젝트 A"에 id가 7인 새로운 멤버를 team_members 배열에 추가하고 싶어. array_append()를 써보자:
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = '프로젝트 A';
-- 결과 확인:
SELECT * FROM projects;
결과:
| id | name | team_members |
|---|---|---|
| 1 | 프로젝트 A | {1,2,3,7} |
| 2 | 프로젝트 B | {4,5} |
보다시피, id가 7인 멤버가 배열에 잘 추가됐지!
예시 2: 텍스트 요소 추가하기
이 array_append()는 다른 타입의 배열에도 쓸 수 있어. 예를 들어, 상품 카테고리 배열에 새로운 카테고리를 추가해보자.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- 카테고리와 함께 상품 추가
INSERT INTO products (name, categories)
VALUES
('스마트폰', ARRAY['전자제품', '가젯']),
('노트북', ARRAY['컴퓨터', '전자제품']);
-- "스마트폰"에 "인기상품" 카테고리 추가
UPDATE products
SET categories = array_append(categories, '인기상품')
WHERE name = '스마트폰';
-- 결과 확인:
SELECT * FROM products;
결과:
| id | name | categories |
|---|---|---|
| 1 | 스마트폰 | {전자제품,가젯,인기상품} |
| 2 | 노트북 | {컴퓨터,전자제품} |
array_remove()로 배열에서 요소 삭제하기
array_append()가 새로운 할 일을 리스트에 추가하는 거라면, array_remove()는 이미 끝낸 할 일을 지우는 도구야. 이 함수도 인자가 두 개야:
- 원본 배열
- 삭제하고 싶은 값
예시 1: 숫자 배열에서 요소 삭제
다시 projects 테이블로 돌아가자. id가 7인 멤버가 더 이상 "프로젝트 A"에서 일하지 않는다고 해. 그럼 team_members 배열에서 이 값을 지워보자:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = '프로젝트 A';
-- 결과 확인:
SELECT * FROM projects;
결과:
| id | name | team_members |
|---|---|---|
| 1 | 프로젝트 A | {1,2,3} |
| 2 | 프로젝트 B | {4,5} |
array_remove() 함수가 id 7인 멤버를 잘 지웠어.
예시 2: 텍스트 요소 삭제
이번엔 products 테이블을 보자. 만약 "인기상품" 카테고리가 더 이상 스마트폰에 필요 없다면, 이렇게 지울 수 있어:
UPDATE products
SET categories = array_remove(categories, '인기상품')
WHERE name = '스마트폰';
-- 결과 확인:
SELECT * FROM products;
결과:
| id | name | categories |
|---|---|---|
| 1 | 스마트폰 | {전자제품,가젯} |
| 2 | 노트북 | {컴퓨터,전자제품} |
지우려고 하는 요소가 배열에 없으면 array_remove()는 배열을 그대로 둬. 에러도 안 나고, 그냥 아무 일도 안 일어나. 이거 꽤 편해.
array_append()랑 array_remove() 같이 쓰기
가끔은 배열에 요소가 이미 없는지 먼저 확인하고, 없을 때만 추가하고 싶을 때가 있어. 이럴 땐 함수들을 조합해서 써봐:
예시: 중복 없이 요소 추가하기
id가 7인 멤버가 배열에 없을 때만 추가되게 해보자. array_remove()로 체크해볼 수 있어:
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = '프로젝트 A' AND NOT (team_members @> ARRAY[7]);
-- 결과 확인:
SELECT * FROM projects;
설명:
@>연산자는 배열에7이 들어있는지 확인해.team_members에 이미7이 있으면 추가 안 해.
자주 하는 실수랑 꿀팁
1. NULL을 배열에 추가하려고 할 때 array_append()에 NULL을 넣으면 (예: array_append(team_members, NULL)) 배열에 NULL 값이 추가돼. 에러는 안 나지만, 원하는 결과가 아닐 수도 있어. 이런 걸 막으려면 추가 전에 값이 NULL이 아닌지 체크해.
-- 체크 예시:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = '프로젝트 A';
2. 배열에 다른 타입의 값 넣으려고 할 때 PostgreSQL 배열은 한 가지 타입만 담을 수 있어. 예를 들어, 숫자 배열에 문자열을 넣으려고 하면 에러가 나:
-- 이건 에러 남:
UPDATE projects
SET team_members = array_append(team_members, 'example');
이런 실수를 피하려면 타입이 맞는지 꼭 확인해. 확실하지 않으면 ::로 타입을 바꿔서 넣어:
-- 타입 변환 예시:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
GO TO FULL VERSION