데이터 타입 Map(K, V)은 key-value 쌍을 저장합니다.
다른 데이터베이스와 달리 ClickHouse에서 맵은 유일(unique)하지 않습니다. 즉, 하나의 맵에 동일한 키를 가진 두 개의 요소가 포함될 수 있습니다.
(이는 맵이 내부적으로 Array(Tuple(K, V))로 구현되어 있기 때문입니다.)
맵 m에서 키 k에 대한 값을 얻기 위해 m[k] 구문을 사용할 수 있습니다.
또한 m[k]는 맵 전체를 스캔하므로, 연산 시간은 맵 크기에 비례하여 선형적으로 증가합니다.
파라미터
예시
맵 타입 컬럼을 가진 테이블을 생성합니다:
CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});
key2 값을 선택하려면:
SELECT m['key2'] FROM tab;
결과:
┌─arrayElement(m, 'key2')─┐
│ 10 │
│ 20 │
│ 30 │
└─────────────────────────┘
요청한 키 k가 맵에 포함되어 있지 않으면 m[k]는 값 타입의 기본값을 반환합니다. 예를 들어 정수 타입은 0, 문자열 타입은 ''을(를) 반환합니다.
맵에 키가 존재하는지 확인하려면 mapContains 함수를 사용할 수 있습니다.
CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':100}), ({});
SELECT m['key1'] FROM tab;
결과:
┌─arrayElement(m, 'key1')─┐
│ 100 │
│ 0 │
└─────────────────────────┘
Tuple을 맵(Map)으로 변환하기
Tuple() 타입의 값은 함수 CAST를 사용하여 Map() 타입의 값으로 형변환할 수 있습니다.
예시
쿼리:
SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;
결과:
┌─map───────────────────────────┐
│ {1:'Ready',2:'Steady',3:'Go'} │
└───────────────────────────────┘
Map 서브컬럼 읽기
전체 맵을 모두 읽지 않도록, 상황에 따라 서브컬럼 keys와 values를 사용할 수 있습니다.
예제
쿼리:
CREATE TABLE tab (m Map(String, UInt64)) ENGINE = Memory;
INSERT INTO tab VALUES (map('key1', 1, 'key2', 2, 'key3', 3));
SELECT m.keys FROM tab; -- same as mapKeys(m)
SELECT m.values FROM tab; -- same as mapValues(m)
결과:
┌─m.keys─────────────────┐
│ ['key1','key2','key3'] │
└────────────────────────┘
┌─m.values─┐
│ [1,2,3] │
└──────────┘
참고
관련 콘텐츠