CodeGym /행동 /SQL SELF /배열 데이터 바꾸기: array_append(), array_re...

배열 데이터 바꾸기: array_append(), array_remove()

SQL SELF
레벨 35 , 레슨 3
사용 가능

가끔 배열을 그냥 읽는 것만이 아니라, 값을 추가하거나, 오래된 값을 지우거나, 내용을 업데이트해야 할 때가 있어. 다행히도 PostgreSQL에는 이런 걸 쉽게 해주는 함수들이 있어. 배열을 직접 다시 쓰지 않아도 array_append()array_remove()로 배열 내용을 쉽게 관리할 수 있어. 어떻게 쓰는지 같이 보자.

array_append()로 배열에 요소 추가하기

array_append() 함수는 배열 맨 끝에 새로운 요소를 추가할 때 써. 이 함수는 두 개의 인자를 받아:

  1. 수정하려는 원본 배열
  2. 배열에 추가하고 싶은 값

예시 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. 원본 배열
  2. 삭제하고 싶은 값

예시 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);
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION