리스트 타입
리스트 타입 (List Type)
LIST 컬럼은 값들의 리스트를 인코딩해요. 컬럼의 필드는 서로 다른 길이의 값을 가질 수 있지만 모두 같은 기저 타입이어야 해요. LIST는 보통 숫자 배열을 저장하는 데 사용되지만, 다른 LIST와 STRUCT를 포함한 어떤 균일 데이터 타입도 담을 수 있어요.
출처: 문서
본문
LIST는 PostgreSQL의 ARRAY 타입과 비슷해요. DuckDB는 LIST 용어를 사용하지만 PostgreSQL 호환성을 위해 일부 array_ 함수를 제공해요.
중첩 데이터 타입 간의 비교는 데이터 타입 개요에서 확인해요.
고정 길이 리스트를 저장하려면 DuckDB는
ARRAY타입을 사용해요.
리스트 만들기 (Creating Lists)
리스트는 list_value(expr, ...) 함수나 동등한 대괄호 표기법 [expr, ...]으로 만들 수 있어요. 표현식은 상수나 임의의 표현식일 수 있어요. 테이블 컬럼에서 리스트를 만들려면 list 집계 함수를 사용해요.
정수 리스트:
SELECT [1, 2, 3];
NULL 값이 있는 문자열 리스트:
SELECT ['duck', 'goose', NULL, 'heron'];
NULL 값이 있는 리스트의 리스트:
SELECT [['duck', 'goose', 'heron'], NULL, ['frog', 'toad'], []];
list_value 함수로 리스트 만들기:
SELECT list_value(1, 2, 3);
INTEGER 리스트 컬럼과 VARCHAR 리스트 컬럼을 가진 테이블 만들기:
CREATE TABLE list_table (int_list INTEGER[], varchar_list VARCHAR[]);
리스트에서 가져오기 (Retrieving from Lists)
리스트에서 하나 이상의 값을 가져오는 것은 대괄호와 슬라이스 표기법, 또는 list_extract 같은 리스트 함수를 통해 수행할 수 있어요. 리스트를 배열이라고 부르는 시스템과의 호환성을 위해 여러 동등한 함수가 별칭으로 제공돼요. 예를 들어 array_slice 함수가 있어요.
| Example | Result |
|---|---|
| SELECT ['a', 'b', 'c'][3] | 'c' |
| SELECT ['a', 'b', 'c'][-1] | 'c' |
| SELECT ['a', 'b', 'c'][2 + 1] | 'c' |
| SELECT list_extract(['a', 'b', 'c'], 3) | 'c' |
| SELECT ['a', 'b', 'c'][1:2] | ['a', 'b'] |
| SELECT ['a', 'b', 'c'][:2] | ['a', 'b'] |
| SELECT ['a', 'b', 'c'][-2:] | ['b', 'c'] |
| SELECT list_slice(['a', 'b', 'c'], 2, 3) | ['b', 'c'] |
비교와 정렬 (Comparison and Ordering)
LIST 타입은 모든 비교 연산자로 비교할 수 있어요. 이러한 비교는 WHERE와 HAVING 절 같은 논리 표현식에서 사용할 수 있고 BOOLEAN 값을 반환해요.
LIST 정렬은 다음 규칙을 사용해 위치적으로 정의되는데, 여기서 min_len = min(len(l1), len(l2))이에요.
- 동등성.
len(l1) = len(l2)이고[1, min_len]의 각i에 대해l1[i] = l2[i]이면l1과l2는 같아요. - 미만.
l1[i] != l2[i]인[1, min_len]의 첫 인덱스i에 대해:l1[i] < l2[i]이면l1은l2보다 작아요. 모든 값이 같으면 더 긴 리스트가 나중에 정렬돼요.
NULL 값은 PostgreSQL의 의미론을 따라 비교돼요: 최상위 수준에서 NULL과의 비교는 NULL을 산출해요. 더 낮은 중첩 수준에서는 NULL이 다른 값보다 큰 것으로 취급돼요.
다음은 비교에 대해 true를 반환하는 쿼리들이에요.
SELECT [1, 2] < [1, 3] AS result;
SELECT [[1], [2, 4, 5]] < [[2]] AS result;
SELECT [ ] < [1] AS result;
SELECT [1, 2] < [1, NULL, 4] AS result;
다음 쿼리들은 false를 반환해요.
SELECT [ ] < [ ] AS result;
SELECT [1, 2] < [1] AS result;
다음 쿼리들은 NULL을 반환해요.
SELECT NULL = [1] AS result;
함수 (Functions)
리스트 함수를 참고해요.