맵 타입
맵 타입 (Map Type)
MAP은 키-값 쌍의 순서 있는 리스트라는 점에서 STRUCT와 비슷해요. 하지만 MAP은 각 행마다 같은 키가 존재할 필요가 없어서, 스키마를 미리 알 수 없거나 행마다 다른 경우에 적합해요.
출처: 문서
본문
MAP은 모든 키에 대해 단일 타입, 모든 값에 대해 단일 타입을 가져야 해요. 키와 값은 어떤 타입이든 될 수 있고, 키의 타입이 값의 타입과 일치할 필요는 없어요(예: VARCHAR에서 INT로의 MAP은 유효해요). MAP은 중복 키를 가질 수 없어요. MAP은 키를 찾지 못하면 struct처럼 오류를 던지는 대신 NULL을 반환해요.
반면 STRUCT은 문자열 키를 가져야 하지만 각 값은 다른 타입일 수 있어요. 중첩 데이터 타입 간의 비교는 데이터 타입 개요에서 확인해요.
MAP을 구성하려면 MAP 키워드가 앞에 붙는 대괄호 문법을 사용해요.
맵 만들기 (Creating Maps)
VARCHAR 키와 INTEGER 값이 있는 맵. 이는 {key1=10, key2=20, key3=30}을 반환해요.
SELECT MAP {'key1': 10, 'key2': 20, 'key3': 30};
또는 map_from_entries 함수를 사용해요. 이는 {key1=10, key2=20, key3=30}을 반환해요.
SELECT map_from_entries([('key1', 10), ('key2', 20), ('key3', 30)]);
맵은 키와 값 두 리스트를 사용해서도 만들 수 있어요. 이는 {key1=10, key2=20, key3=30}을 반환해요.
SELECT MAP(['key1', 'key2', 'key3'], [10, 20, 30]);
맵은 INTEGER 키와 NUMERIC 값을 사용할 수도 있어요. 이는 {1=42.001, 5=-32.100}을 반환해요.
SELECT MAP {1: 42.001, 5: -32.1};
키와/또는 값은 중첩 타입일 수도 있어요. 이는 {[a, b]=[1.1, 2.2], [c, d]=[3.3, 4.4]}을 반환해요.
SELECT MAP {['a', 'b']: [1.1, 2.2], ['c', 'd']: [3.3, 4.4]};
INTEGER 키와 DOUBLE 값이 있는 맵 컬럼을 가진 테이블 만들기:
CREATE TABLE tbl (col MAP(INTEGER, DOUBLE));
맵에서 가져오기 (Retrieving from Maps)
MAP 값은 map_extract_value 함수나 대괄호 표기를 사용해 가져올 수 있어요.
SELECT MAP {'key1': 5, 'key2': 43}['key1'];
5
키의 타입이 틀리면 오류가 발생해요. 타입은 맞지만 단지 맵에 포함되어 있지 않으면 NULL 값이 반환돼요.
SELECT MAP {'key1': 5, 'key2': 43}['key3'];
NULL
map_extract 함수(및 그 동의어 element_at)는 리스트로 감싼 값을 가져오는 데 사용할 수 있어요. 키가 맵에 없으면 빈 리스트를 반환해요.
SELECT map_extract(MAP {'key1': 5, 'key2': 43}, 'key1');
[5]
SELECT MAP {'key1': 5, 'key2': 43}['key3'];
[]
비교 연산자 (Comparison Operators)
중첩 타입은 모든 비교 연산자로 비교할 수 있어요. 이러한 비교는 WHERE와 HAVING 절 모두에 대한 논리 표현식과 Boolean 값 생성에 사용될 수 있어요.
정렬은 사전에서 단어를 정렬할 수 있는 방식과 같이 위치적으로 정의돼요. NULL 값은 다른 모든 값보다 크게 비교되고 서로 동일한 것으로 간주돼요.
최상위 수준에서 NULL 중첩 값은 표준 SQL NULL 비교 규칙을 따르는 반면, 비-NULL 중첩 값과 NULL 중첩 값을 비교하면 NULL 결과가 생성돼요. 그러나 중첩 값 멤버 를 비교할 때는 내부 중첩 값 규칙을 사용하며, NULL 중첩 값 멤버는 비-NULL 중첩 값 멤버보다 위에 비교돼요.
함수 (Functions)
맵 함수를 참고해요.