- 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> ] )
Argumente¶
mapDas Zuordnungs-Quellobjekt, in das das neue Schlüssel-Wert-Paar eingefügt wird.
keyDer 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,
updateFlagist auf TRUE gesetzt.valueDer dem Schlüssel zugeordnete Wert.
Optional
updateFlagEin 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
keyeine beliebige andere Zeichenfolge als NULL ist undvalueeine JSON-Null ist (zum BeispielPARSE_JSON('NULL')), dann wird das Schlüssel-Wert-Paar in das zurückgegebene Zuordnungsobjekt eingefügt.Wenn der Schlüssel
keyeine beliebige andere Zeichenfolge als NULL ist undvalueein 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
keyein SQL-NULL-Wert ist, wird das Schlüssel-Wert-Paar aus dem zurückgegebenen Zuordnungsobjekt weggelassen.
Wenn
updateFlagauf TRUE gesetzt wird, dann wird das bestehende Eingabe-key-Objekt auf den Eingabewertvalueaktualisiert. WennupdateFlagweggelassen oder auf FALSE gesetzt wird und der Eingabeschlüssel bereits in dem Zuordnungsobjekt existiert, wird ein Fehler zurückgegeben.Wenn
updateFlagauf 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);
+------------------------------------------------------+
| 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_Onebesteht aus einem JSON-Nullwert.Key_Twobesteht aus einem SQL-NULL-Wert, der in einen JSON-Nullwert konvertiert wird.Key_Threebesteht 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');
+---------------------------------------------------------------------------+
| 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;
+------------------------+
| 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';
Fragen Sie die Tabelle ab, um die Daten anzuzeigen:
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" | ] | | | | | |
| | | } | | | | | | |
+----+---------------------+----------------------+--------------+----------+---------+-----------------+----------+----------+
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;
+----+-------------------------+
| ID | ATTRS_INSERT_OR_UPDATE |
|----+-------------------------|
| 1 | { |
| | "brand": "Acme", |
| | "color": "red", |
| | "material": "cotton", |
| | "size": "M" |
| | } |
| 2 | { |
| | "brand": "ZC", |
| | "color": "blue" |
| | } |
+----+-------------------------+