ARRAY 타입
ARRAY 타입
ARRAY 컬럼은 고정 크기 배열을 저장해요. 컬럼의 모든 필드는 같은 길이와 같은 기본 타입을 가져야 해요. 배열은 주로 숫자 배열을 저장하는 데 쓰이지만, ARRAY·LIST·STRUCT 타입을 포함한 모든 균일한 데이터 타입을 담을 수 있어요.
출처: 문서
본문
ARRAY 컬럼은 고정 크기 배열을 저장해요. 컬럼의 모든 필드는 같은 길이와 같은 기본 타입을 가져야 해요. 배열은 주로 숫자 배열을 저장하는 데 쓰이지만, ARRAY, LIST 및 STRUCT 타입을 포함한 모든 균일한 데이터 타입을 담을 수 있어요.
배열은 워드 임베딩이나 이미지 임베딩 같은 벡터를 저장하는 데 사용할 수 있어요.
가변 길이 목록을 저장하려면 LIST 타입을 사용해요. 중첩 데이터 타입 간 비교는 데이터 타입 개요를 참고해요.
PostgreSQL의
ARRAY타입은 가변 길이 필드를 허용해요. DuckDB의ARRAY타입은 고정 길이예요.
배열 만들기
배열은 array_value(expr, ...) 함수로 만들 수 있어요.
array_value 함수로 구성:
SELECT array_value(1, 2, 3);
배열을 목록으로 암시적으로 cast할 수 있어요 (그리고 list_extract, [i] 같은 목록 함수를 사용할 수 있어요).
SELECT array_value(1, 2, 3)[2];
목록에서 배열로 cast할 수 있어요 (차원이 일치해야 해요).
SELECT [3, 2, 1]::INTEGER[3];
배열은 중첩될 수 있어요.
SELECT array_value(array_value(1, 2), array_value(3, 4), array_value(5, 6));
배열은 struct를 저장할 수 있어요.
SELECT array_value({'a': 1, 'b': 2}, {'a': 3, 'b': 4});
배열 필드 정의하기
배열은 ⟨TYPE_NAME⟩[⟨LENGTH⟩] 문법으로 만들 수 있어요. 예를 들어 3개의 정수 배열 필드를 만들려면:
CREATE TABLE array_table (id INTEGER, arr INTEGER[3]);
INSERT INTO array_table VALUES (10, [1, 2, 3]), (20, [4, 5, 6]);
배열에서 값 가져오기
배열에서 하나 이상의 값을 가져오려면 대괄호와 슬라이싱 표기를 사용하거나, list_extract와 array_extract 같은 목록 함수를 사용할 수 있어요. 배열 필드 정의하기의 예제를 사용해요.
배열의 첫 번째 요소를 추출하는 다음 쿼리들은 모두 동일해요.
SELECT id, arr[1] AS element FROM array_table;
SELECT id, list_extract(arr, 1) AS element FROM array_table;
SELECT id, array_extract(arr, 1) AS element FROM array_table;
| id | element |
|---|---|
| 10 | 1 |
| 20 | 4 |
슬라이싱 표기를 사용하면 LIST를 반환해요.
SELECT id, arr[1:2] AS elements FROM array_table;
| id | elements |
|---|---|
| 10 | [1, 2] |
| 20 | [4, 5] |
함수
모든 LIST 함수는 ARRAY 타입과 함께 동작해요. 또한 여러 ARRAY-네이티브 함수도 지원돼요. ARRAY 함수를 참고해요.
예제
샘플 데이터 만들기:
CREATE TABLE x (i INTEGER, v FLOAT[3]);
CREATE TABLE y (i INTEGER, v FLOAT[3]);
INSERT INTO x VALUES (1, array_value(1.0::FLOAT, 2.0::FLOAT, 3.0::FLOAT));
INSERT INTO y VALUES (1, array_value(2.0::FLOAT, 3.0::FLOAT, 4.0::FLOAT));
교차곱(cross product) 계산:
SELECT array_cross_product(x.v, y.v)
FROM x, y
WHERE x.i = y.i;
코사인 유사도 계산:
SELECT array_cosine_similarity(x.v, y.v)
FROM x, y
WHERE x.i = y.i;
정렬
ARRAY 인스턴스의 정렬은 사전 순(lexicographical order)으로 정의돼요. NULL 값은 다른 모든 값보다 크게 비교되며, 서로 동일한 것으로 간주돼요.