- Catégories :
Fonctions de données semi-structurées et structurées (Carte)
MAP_INSERT¶
Renvoie une nouvelle MAP constituée de la MAP d’entrée ainsi que d’une nouvelle paire clé-valeur insérée, autrement dit une clé existante est mise à jour avec une nouvelle valeur.
Syntaxe¶
MAP_INSERT( <map> , <key> , <value> [ , <updateFlag> ] )
Arguments¶
map
La carte source dans laquelle la nouvelle paire clé-valeur est insérée.
key
La nouvelle clé à insérer dans la carte. Doit être différente de toutes les clés existantes dans la carte, à moins que
updateFlag
ne soit défini sur TRUE.value
La valeur associée à la clé.
Facultatif
updateFlag
Indicateur booléen qui, lorsqu’il est défini sur TRUE, spécifie que la valeur d’entrée est utilisée pour mettre à jour la valeur existante d’une clé dans la carte, plutôt que d’insérer une nouvelle paire clé-valeur.
La valeur par défaut est FALSE.
Renvoie¶
Renvoie une MAP constituée de la MAP d’entrée ainsi que d’une nouvelle paire clé-valeur insérée ou d’une clé existante mise à jour avec une nouvelle valeur.
Notes sur l’utilisation¶
Le type de l’expression de clé doit correspondre au type de la clé de la carte. Si le type est VARCHAR, les types peuvent être de longueurs différentes.
La fonction prend en charge les valeurs nulles JSON, mais pas les valeurs ni les clés SQL NULL :
Si
key
est une chaîne autre que NULL et quevalue
est une valeur nulle JSON (par exemple,PARSE_JSON('NULL')
), alors la paire clé-valeur est insérée dans la carte renvoyée.Si
key
est une chaîne autre que NULL et sivalue
est une valeur SQL NULL (par exemple,NULL
), la valeur est convertie en valeur JSON nulle et la paire clé-valeur est insérée dans la carte renvoyée.Si
key
est une valeur SQL NULL, la paire clé-valeur est omise de la carte renvoyée.
Si
updateFlag
est défini sur TRUE, l’entrée existantekey
est mise à jour sur l’entréevalue
. SiupdateFlag
est omis ou défini sur FALSE, et si la clé d’entrée existe déjà dans la carte, une erreur est renvoyée.Si
updateFlag
est défini sur TRUE, mais que la clé correspondante n’existe pas encore dans la carte, la paire clé-valeur est ajoutée.
Exemples¶
Insérer une troisième paire clé-valeur dans une carte contenant deux paires clé-valeur :
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 |
| } |
+------------------------------------------------------+
Insérer deux nouvelles paires clé-valeur, tout en omettant une paire clé-valeur, dans une carte vide :
Key_One
comprend une valeur JSON nulle.Key_Two
se compose d’une valeur SQL NULL, qui est convertie en valeur JSON nulle.Key_Three
consiste en une chaîne de caractères contenant « 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 |
| } |
+---------------------------------------------------------------------------+
Mettre à jour une paire clé-valeur existante ("k1": 100
) avec une nouvelle valeur ("string-value"
) :
SELECT MAP_INSERT({'k1':100}::MAP(VARCHAR,VARCHAR), 'k1', 'string-value', TRUE) AS map;
+------------------------+
| MAP |
|------------------------|
| { |
| "k1": "string-value" |
| } |
+------------------------+
Création d’une table temporaire qui contient des valeurs 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';
Interrogez la table pour afficher les données :
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" | ] | | | | | |
| | | } | | | | | | |
+----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------+
À l’aide des clés de la colonne ins_key
et des valeurs de la colonne ins_val
, insérer ou mettre à jour les paires clé-valeur dans les cartes de la colonne 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" |
| | } |
+----+-------------------------+