MAP_INSERT
MAP_INSERT (맵 삽입)
새 키-값 쌍이 삽입된 입력 MAP으로 구성된 새 MAP을 반환해요. 즉, 기존 키가 새 값으로 업데이트돼요.
본문
구문
MAP_INSERT( <map>, <key>, <value> [, <updateFlag> ] )
인자
map
새 키-값 쌍이 삽입되는 원본 맵이에요.
key
맵에 삽입할 새 키예요. updateFlag가 TRUE로 설정되지 않는 한 맵의 모든 기존 키와 달라야 해요.
value
키와 연결된 값이에요.
선택:
updateFlag
TRUE로 설정되면 입력 값이 새 키-값 쌍을 삽입하는 대신 맵의 키에 대한 기존 값을 업데이트하는 데 사용됨을 지정하는 부울 플래그예요.
기본값은 FALSE예요.
반환 값
새 키-값 쌍이 삽입되거나 기존 키가 새 값으로 업데이트된 입력 MAP으로 구성된 MAP을 반환해요.
사용상 주의사항
- 키 표현식의 타입은 맵 키의 타입과 일치해야 해요. 타입이 VARCHAR이면 타입은 길이가 다를 수 있어요.
- 이 함수는 JSON null 값을 지원하지만 SQL NULL 값이나 키는 지원하지 않아요: key가 NULL이 아닌 문자열이고 value가 JSON null(예:
PARSE_JSON('NULL'))이면 키-값 쌍이 반환된 맵에 삽입돼요. key가 NULL이 아닌 문자열이고 value가 SQL NULL(예:NULL)이면 값이 JSON null로 변환되고 키-값 쌍이 반환된 맵에 삽입돼요. key가 SQL NULL이면 키-값 쌍은 반환된 맵에서 생략돼요. - updateFlag가 TRUE로 설정되면 기존 입력 키가 입력 값으로 업데이트돼요. updateFlag가 생략되거나 FALSE로 설정되고 입력 키가 이미 맵에 존재하면 오류가 반환돼요.
- updateFlag가 TRUE로 설정되었지만 해당 키가 맵에 이미 존재하지 않으면 키-값 쌍이 추가돼요.
예시
두 개의 키-값 쌍을 포함하는 맵에 세 번째 키-값 쌍을 삽입해요:
SELECT MAP_INSERT({'a':1,'b':2}::MAP(VARCHAR,NUMBER), 'c', 3);
+------------------------------------------------------+
| MAP_INSERT({'A':1,'B':2}::MAP(VARCHAR,NUMBER),'C',3) |
|------------------------------------------------------|
| { |
| "a": 1, |
| "b": 2, |
| "c": 3 |
| } |
+------------------------------------------------------+
빈 맵에 두 개의 새 키-값 쌍을 삽입하면서 하나의 키-값 쌍은 생략해요:
- Key_One은 JSON null 값으로 구성돼요.
- Key_Two는 JSON null 값으로 변환되는 SQL NULL 값으로 구성돼요.
- Key_Three는 "null"을 포함하는 문자열로 구성돼요.
SELECT MAP_INSERT(MAP_INSERT(MAP_INSERT({}::MAP(VARCHAR,VARCHAR),
'Key_One', PARSE_JSON('NULL')), 'Key_Two', NULL), 'Key_Three', 'null');
+---------------------------------------------------------------------------+
| MAP_INSERT(MAP_INSERT(MAP_INSERT({}::MAP(VARCHAR,VARCHAR), |
| 'KEY_ONE', PARSE_JSON('NULL')), 'KEY_TWO', NULL), 'KEY_THREE', 'NULL') |
|---------------------------------------------------------------------------|
| { |
| "Key_One": null, |
| "Key_Three": "null", |
| "Key_Two": null |
| } |
+---------------------------------------------------------------------------+
기존 키-값 쌍("k1": 100)을 새 값("string-value")으로 업데이트해요:
SELECT MAP_INSERT({'k1':100}::MAP(VARCHAR,VARCHAR), 'k1', 'string-value', TRUE) AS map;
+------------------------+
| MAP |
|------------------------|
| { |
| "k1": "string-value" |
| } |
+------------------------+
MAP 값을 포함하는 임시 테이블 생성:
CREATE OR REPLACE TEMP TABLE demo_maps(
id INTEGER,
attrs MAP(VARCHAR, VARCHAR),
defaults MAP(VARCHAR, VARCHAR),
keep_keys ARRAY(VARCHAR),
ins_key VARCHAR,
ins_val VARCHAR,
update_existing BOOLEAN,
del_key1 VARCHAR,
del_key2 VARCHAR);
INSERT INTO demo_maps SELECT
1,
{'color':'red','size':'M','brand':'Acme'}::MAP(VARCHAR, VARCHAR),
{'currency':'USD','size':'L'}::MAP(VARCHAR, VARCHAR),
['color','brand']::ARRAY(VARCHAR),
'material',
'cotton',
TRUE,
'size',
'brand';
INSERT INTO demo_maps SELECT
2,
{'color':'blue','brand':'ZenCo'}::MAP(VARCHAR, VARCHAR),
{'currency':'EUR','size':'M','brand':'ZenCo'}::MAP(VARCHAR, VARCHAR),
['brand','currency']::ARRAY(VARCHAR),
'brand',
'ZC',
FALSE,
'currency',
'material';
데이터를 표시하려면 테이블을 조회해요:
SELECT * FROM demo_maps;
+----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------+
| ID | ATTRS | DEFAULTS | KEEP_KEYS | INS_KEY | INS_VAL | UPDATE_EXISTING | DEL_KEY1 | DEL_KEY2 |
|----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------|
| 1 | { | { | [ | material | cotton | True | size | brand |
| | "brand": "Acme", | "currency": "USD", | "color", | | | | | |
| | "color": "red", | "size": "L" | "brand" | | | | | |
| | "size": "M" | } | ] | | | | | |
| | } | | | | | | | |
| 2 | { | { | [ | brand | ZC | False | currency | material |
| | "brand": "ZenCo", | "brand": "ZenCo", | "brand", | | | | | |
| | "color": "blue" | "currency": "EUR", | "currency" | | | | | |
| | } | "size": "M" | ] | | | | | |
| | | } | | | | | | |
+----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------+
ins_key 열의 키와 ins_val 열의 값을 사용해 attrs 열의 맵에 키-값 쌍을 삽입하거나 업데이트해요:
SELECT id,
MAP_INSERT(attrs, ins_key, ins_val, TRUE) AS attrs_insert_or_update
FROM demo_maps;
+----+-------------------------+
| ID | ATTRS_INSERT_OR_UPDATE |
|----+-------------------------|
| 1 | { |
| | "brand": "Acme", |
| | "color": "red", |
| | "material": "cotton", |
| | "size": "M" |
| | } |
| 2 | { |
| | "brand": "ZC", |
| | "color": "blue" |
| | } |
+----+-------------------------+
더 알아보기
- Semi-structured and structured data functions (Map) — 맵 함수 모음
- MAP — MAP 데이터 타입