Kategorien:

Funktionen für semistrukturierte und strukturierte Daten (Zuordnung/Map)

MAP_INSERT

Gibt ein neues MAP-Objekt zurück, das aus dem Eingabe-MAP-Objekt besteht, in das ein neues Schlüssel-Wert-Paar eingefügt wurde (d. h., ein bestehender Schlüssel wird mit einem neuen Wert aktualisiert).

Syntax

MAP_INSERT( <map> , <key> , <value> [ , <updateFlag> ] )
Copy

Argumente

map

Das Zuordnungs-Quellobjekt, in das das neue Schlüssel-Wert-Paar eingefügt wird.

key

Der neue Schlüssel, der in die Zuordnung eingefügt werden soll. Muss sich von allen in der Zuordnung vorhandenen Schlüsseln unterscheiden, es sei denn, updateFlag ist auf TRUE gesetzt.

value

Der dem Schlüssel zugeordnete Wert.

Optional

updateFlag

Ein Boolesches Flag, das bei der Einstellung TRUE angibt, dass der Eingabewert zum Aktualisieren eines vorhandenen Werts für einen Schlüssel im Zuordnungsobjekt verwendet werden soll, anstatt ein neues Schlüssel-Wert-Paar einzufügen.

Der Standardwert ist FALSE.

Rückgabewerte

Gibt ein MAP-Objekt zurück, das aus dem Eingabe-MAP-Objekt, in das ein neues Schlüssel-Wert-Paar eingefügt wurde oder ein bestehender Schlüssel wurde mit einem neuen Wert aktualisiert.

Nutzungshinweise

  • Der Typ des Schlüsselausdrucks muss mit dem Typ des Schlüssels der Zuordnung übereinstimmen. Wenn der Typ VARCHAR ist, können die Typen unterschiedlich lang sein.

  • Die Funktion unterstützt JSON Null-Werte, aber keine SQL NULL-Werte oder Schlüssel:

    • Wenn key eine beliebige andere Zeichenfolge als NULL ist und value eine JSON-Null ist (zum Beispiel PARSE_JSON('NULL')), dann wird das Schlüssel-Wert-Paar in das zurückgegebene Zuordnungsobjekt eingefügt.

    • Wenn der Schlüssel key eine beliebige andere Zeichenfolge als NULL ist und value ein SQL-NULL-Wert ist (z. B. NULL), dann wird der Wert in einJSON-Null konvertiert und das Schlüssel-Wert-Paar in das zurückgegebene Zuordnungsobjekt eingefügt.

    • Wenn key ein SQL-NULL-Wert ist, wird das Schlüssel-Wert-Paar aus dem zurückgegebenen Zuordnungsobjekt weggelassen.

  • Wenn updateFlag auf TRUE gesetzt wird, dann wird das bestehende Eingabe-key-Objekt auf den Eingabewert value aktualisiert. Wenn updateFlag weggelassen oder auf FALSE gesetzt wird und der Eingabeschlüssel bereits in dem Zuordnungsobjekt existiert, wird ein Fehler zurückgegeben.

  • Wenn updateFlag auf TRUE gesetzt wird, der entsprechende Schlüssel aber noch nicht im Zuordnungsobjekt vorhanden ist, wird das Schlüssel-Wert-Paar hinzugefügt.

Beispiele

Einfügen eines dritten Schlüssel-Wert-Paars in ein Zuordnungsobjekt, das zwei Schlüssel-Wert-Paare enthält:

SELECT MAP_INSERT({'a':1,'b':2}::MAP(VARCHAR,NUMBER),'c',3);
Copy
+------------------------------------------------------+
| MAP_INSERT({'A':1,'B':2}::MAP(VARCHAR,NUMBER),'C',3) |
|------------------------------------------------------|
| {                                                    |
|   "a": 1,                                            |
|   "b": 2,                                            |
|   "c": 3                                             |
| }                                                    |
+------------------------------------------------------+

Einfügen von zwei neuen Schlüssel-Wert-Paaren in ein leeres Zuordnungsobjekt, wobei ein Schlüssel-Wert-Paar weglassen wird:

  • Key_One besteht aus einem JSON-Nullwert.

  • Key_Two besteht aus einem SQL-NULL-Wert, der in einen JSON-Nullwert konvertiert wird.

  • Key_Three besteht aus einer Zeichenfolge, die „null“ enthält.

SELECT MAP_INSERT(MAP_INSERT(MAP_INSERT({}::MAP(VARCHAR,VARCHAR),
  'Key_One', PARSE_JSON('NULL')), 'Key_Two', NULL), 'Key_Three', 'null');
Copy
+---------------------------------------------------------------------------+
| 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                                                         |
| }                                                                         |
+---------------------------------------------------------------------------+

Aktualisieren eines vorhandenen Schlüssel-Wert-Paares ("k1": 100) mit einem neuen Wert ("string-value"):

SELECT MAP_INSERT({'k1':100}::MAP(VARCHAR,VARCHAR), 'k1', 'string-value', TRUE) AS map;
Copy
+------------------------+
| MAP                    |
|------------------------|
| {                      |
|   "k1": "string-value" |
| }                      |
+------------------------+

Erstellen Sie eine temporäre Tabelle, die MAP-Werte enthält:

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

Fragen Sie die Tabelle ab, um die Daten anzuzeigen:

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"        | ]            |          |         |                 |          |          |
|    |                     | }                    |              |          |         |                 |          |          |
+----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------+

Verwenden Sie die Schlüssel in der ins_key-Spalte und den Werte in der ins_val-Spalte, um Schlüssel-Wert-Paare in den Zuordnungen in die attrs Spalte einzufügen oder darin zu aktualisieren:

SELECT id, MAP_INSERT(attrs, ins_key, ins_val, TRUE) AS attrs_insert_or_update
  FROM demo_maps;
Copy
+----+-------------------------+
| ID | ATTRS_INSERT_OR_UPDATE  |
|----+-------------------------|
|  1 | {                       |
|    |   "brand": "Acme",      |
|    |   "color": "red",       |
|    |   "material": "cotton", |
|    |   "size": "M"           |
|    | }                       |
|  2 | {                       |
|    |   "brand": "ZC",        |
|    |   "color": "blue"       |
|    | }                       |
+----+-------------------------+