Kategorien:

Aggregatfunktionen (Semistrukturierte Daten), Fensterfunktionen (Allgemein), Semistrukturierte Datenfunktionen (Array/Objekt)

OBJECT_AGG

Gibt ein OBJECT pro Gruppe zurück. Bei jedem Eingabepaar (Schlüssel, Wert), wobei Schlüssel vom Typ VARCHAR und Wert vom Typ VARIANT sein müssen, enthält das resultierende OBJECT ein Feld Schlüssel: Wert.

Aliasse:

OBJECTAGG

Syntax

Aggregatfunktion

OBJECT_AGG(<key>, <value>)

Fensterfunktionen

OBJECT_AGG(<key>, <value>)
    OVER ( [ PARTITION BY <expr2> ] )
    [ WITHIN GROUP ( <orderby_clause> ) ]

Nutzungshinweise

  • Eingabetupel, bei denen Schlüssel und/oder Wert NULL sind, werden ignoriert.

  • Doppelte Schlüssel innerhalb einer Gruppe führen zu einem Fehler.

  • Das Schlüsselwort DISTINCT wird unterstützt, filtert jedoch nur doppelte Zeilen heraus, bei denen Schlüssel und Wert identisch sind.

  • Bei Verwendung als Fensterfunktion:

    • Diese Funktion unterstützt nicht:

      • ORDER BY-Unterklausel in der OVER()-Klausel

      • Fensterrahmen

Beispiele

CREATE OR REPLACE TABLE objectagg_example(g NUMBER, k VARCHAR(30), v VARIANT);
    INSERT INTO objectagg_example SELECT 0, 'name', 'Joe'::variant;
    INSERT INTO objectagg_example SELECT 0, 'age', 21::variant;
    INSERT INTO objectagg_example SELECT 1, 'name', 'Sue'::variant;
    INSERT INTO objectagg_example SELECT 1, 'zip', 94401::variant;

SELECT * FROM objectagg_example;

---+------+-------+
 G |  K   |   V   |
---+------+-------+
 0 | name | "Joe" |
 0 | age  | 21    |
 1 | name | "Sue" |
 1 | zip  | 94401 |
---+------+-------+
SELECT objectagg(k, v) FROM objectagg_example GROUP BY g;

------------------+
 OBJECTAGG(K, V)  |
------------------+
 {                |
   "name": "Sue", |
   "zip": 94401   |
 }                |
 {                |
   "age": 21,     |
   "name": "Joe"  |
 }                |
------------------+
SELECT seq, key, value
FROM (SELECT objectagg(k, v) o FROM objectagg_example GROUP BY g),
    LATERAL FLATTEN(input => o);

-----+------+-------+
 SEQ | KEY  | VALUE |
-----+------+-------+
 1   | name | "Sue" |
 1   | zip  | 94401 |
 2   | age  | 21    |
 2   | name | "Joe" |
-----+------+-------+