Array 데이터 타입
Array 데이터 타입
T 타입 아이템들의 배열을 저장하는 데이터 타입이에요. 배열 시작 인덱스는 1이에요. T는 배열을 포함한 어떤 데이터 타입이든 될 수 있어요.
출처: 문서
본문
T 타입 아이템들의 배열이며, 배열 시작 인덱스는 1이에요. T는 배열을 포함한 모든 데이터 타입이 될 수 있어요.
배열 만들기 (Creating an Array)
함수를 사용해 배열을 만들 수 있어요.
array(T)
[]를 사용할 수도 있어요.
[]
배열 생성 예시:
SELECT array(1, 2) AS x, toTypeName(x)
┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8) │
└───────┴─────────────────────────┘
SELECT [1, 2] AS x, toTypeName(x)
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8) │
└───────┴────────────────────┘
데이터 타입 다루기 (Working with Data Types)
배열을 즉석에서 만들 때 ClickHouse는 나열된 모든 인자를 저장할 수 있는 가장 좁은 데이터 타입으로 인자 타입을 자동 결정해요. Nullable 값이나 리터럴 NULL 값이 있으면 배열 요소의 타입도 Nullable이 돼요. ClickHouse가 데이터 타입을 결정할 수 없으면 예외를 발생시켜요. 예를 들어 문자열과 숫자를 동시에 배열로 만들려고 할 때(SELECT array(1, 'a')) 그런 일이 생겨요.
자동 데이터 타입 감지 예시:
SELECT array(1, 2, NULL) AS x, toTypeName(x)
┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐
│ [1,2,NULL] │ Array(Nullable(UInt8)) │
└────────────┴───────────────────────────────┘
호환되지 않는 데이터 타입의 배열을 만들려고 하면 ClickHouse가 예외를 던져요.
SELECT array(1, 'a')
Received exception from server (version 1.1.54388):
Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.
배열 크기 (Array Size)
size0 서브컬럼을 사용하면 전체 컬럼을 읽지 않고도 배열의 크기를 알 수 있어요. 다차원 배열에서는 sizeN-1을 사용할 수 있는데, 여기서 N은 원하는 차원이에요.
예시 (Example)
쿼리:
CREATE TABLE t_arr (`arr` Array(Array(Array(UInt32)))) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]);
SELECT arr.size0, arr.size1, arr.size2 FROM t_arr;
응답:
┌─arr.size0─┬─arr.size1─┬─arr.size2─┐
│ 1 │ [2] │ [[4,1]] │
└───────────┴───────────┴───────────┘
배열에서 중첩 서브컬럼 읽기 (Reading nested subcolumns from Array)
Array 안의 중첩 타입 T가 서브컬럼을 갖고 있다면(예: named tuple), 같은 서브컬럼 이름으로 Array(T) 타입에서 그 서브컬럼을 읽을 수 있어요. 서브컬럼의 타입은 원래 서브컬럼 타입의 Array가 돼요.
예시 (Example)
CREATE TABLE t_arr (arr Array(Tuple(field1 UInt32, field2 String))) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t_arr VALUES ([(1, 'Hello'), (2, 'World')]), ([(3, 'This'), (4, 'is'), (5, 'subcolumn')]);
SELECT arr.field1, toTypeName(arr.field1), arr.field2, toTypeName(arr.field2) from t_arr;
┌─arr.field1─┬─toTypeName(arr.field1)─┬─arr.field2────────────────┬─toTypeName(arr.field2)─┐
│ [1,2] │ Array(UInt32) │ ['Hello','World'] │ Array(String) │
│ [3,4,5] │ Array(UInt32) │ ['This','is','subcolumn'] │ Array(String) │
└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘