Catégories :

Fonctions de données semi-structurées et structurées (Carte)

MAP_PICK

Renvoie une nouvelle MAP contenant les paires clé-valeur spécifiées d’une MAP existante.

Pour identifier les paires clé-valeur à inclure dans la nouvelle carte, transmettez les clés comme arguments ou transmettez un tableau contenant les clés.

Si une clé spécifiée n’est pas présente dans la carte d’entrée, la clé est ignorée.

Syntaxe

MAP_PICK( <map>, <key1> [, <key2>, ... ] )

MAP_PICK( <map>, <array> )
Copy

Arguments

map

La carte d’entrée.

key1,key2

Une ou plusieurs clés identifiant les paires clé-valeur à inclure dans la carte renvoyée.

array

Un tableau de clés identifiant les paires clé-valeur à inclure dans la carte renvoyée. Vous pouvez spécifier un ARRAY semi-structuré ou un ARRAY structuré.

Renvoie

Renvoie une nouvelle MAP contenant certaines des paires clé-valeur d’une MAP existante.

Exemples

Créer une nouvelle carte contenant deux des trois paires clé-valeur d’une carte existante :

SELECT MAP_PICK({'a':1,'b':2,'c':3}::MAP(VARCHAR,NUMBER),'a', 'b')
  AS new_map;
Copy
+-----------+
| NEW_MAP   |
|-----------|
| {         |
|   "a": 1, |
|   "b": 2  |
| }         |
+-----------+

Dans l’exemple précédent, les clés sont transmises comme arguments à MAP_PICK. Vous pouvez également utiliser un tableau pour spécifier les clés :

SELECT MAP_PICK({'a':1,'b':2,'c':3}::MAP(VARCHAR,NUMBER), ['a', 'b'])
  AS new_map;
Copy
+-----------+
| NEW_MAP   |
|-----------|
| {         |
|   "a": 1, |
|   "b": 2  |
| }         |
+-----------+

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';
Copy

Interrogez la table pour afficher les données :

SELECT * FROM demo_maps;
Copy
+----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------+
| 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 keep_keys, renvoyez les nouvelles valeurs MAP à partir des valeurs MAP de la colonne attrs :

SELECT id, MAP_PICK(attrs, keep_keys) AS attrs_subset
  FROM demo_maps;
Copy
+----+--------------------+
| ID | ATTRS_SUBSET       |
|----+--------------------|
|  1 | {                  |
|    |   "brand": "Acme", |
|    |   "color": "red"   |
|    | }                  |
|  2 | {                  |
|    |   "brand": "ZenCo" |
|    | }                  |
+----+--------------------+