Kategorien:

Semistrukturierte Datenfunktionen (Array/Objekt)

OBJECT_CONSTRUCT

Gibt ein OBJECT zurück, das aus den Argumenten aufgebaut ist.

Syntax

OBJECT_CONSTRUCT( [<key1>, <value1> [, <keyN>, <valueN> ...]] )

OBJECT_CONSTRUCT( * )

Nutzungshinweise

  • Die Funktion akzeptiert entweder eine Folge von null oder mehr Schlüssel-Wert-Paaren (wobei Schlüssel Zeichenfolgen und Werte eines beliebigen Typs sind) oder ein Sternchen. Beim Aufrufen mit einem Sternchen wird das Objekt unter Verwendung der Attributnamen als Schlüssel und der zugeordneten Tupelwerte als Werte erstellt. Siehe die Beispiele unten.

  • Wenn der Schlüssel oder Wert NULL ist (d. h. SQL NULL), wird das Schlüssel-Wert-Paar aus dem resultierenden Objekt weggelassen. Ein Schlüssel-Wert-Paar, bestehend aus einer Nicht-Null-Zeichenfolge als Schlüssel und einem JSON-NULL-Wert (d. h. PARSE_JSON(‚NULL‘)) wird nicht weggelassen.

  • Das konstruierte Objekt behält nicht unbedingt die ursprüngliche Reihenfolge der Schlüssel-Wert-Paare bei.

Beispiele

Dies zeigt, wie ein einfaches Objekt erstellt wird:

SELECT OBJECT_CONSTRUCT('a',1,'b','BBBB', 'c',null);
+----------------------------------------------+
| OBJECT_CONSTRUCT('A',1,'B','BBBB', 'C',NULL) |
|----------------------------------------------|
| {                                            |
|   "a": 1,                                    |
|   "b": "BBBB"                                |
| }                                            |
+----------------------------------------------+

In diesem Beispiel wird * verwendet, um den Attributnamen und den Wert aus der FROM Klausel abzurufen:

CREATE TABLE demo_table_1 (province VARCHAR, created_date DATE);
INSERT INTO demo_table_1 (province, created_date) VALUES
    ('Manitoba', '2020-01-18'::DATE),
    ('Alberta', '2020-01-19'::DATE);
SELECT * FROM demo_table_1;
+----------+--------------+
| PROVINCE | CREATED_DATE |
|----------+--------------|
| Manitoba | 2020-01-18   |
| Alberta  | 2020-01-19   |
+----------+--------------+
SELECT OBJECT_CONSTRUCT(*) FROM demo_table_1;
+---------------------------------+
| OBJECT_CONSTRUCT(*)             |
|---------------------------------|
| {                               |
|   "CREATED_DATE": "2020-01-18", |
|   "PROVINCE": "Manitoba"        |
| }                               |
| {                               |
|   "CREATED_DATE": "2020-01-19", |
|   "PROVINCE": "Alberta"         |
| }                               |
+---------------------------------+

Dies ist ein weiteres Beispiel mit *. In diesem Fall werden keine Attributnamen angegeben, daher verwendet Snowflake „COLUMN1“, „COLUMN2“ usw.:

SELECT OBJECT_CONSTRUCT(*) FROM VALUES(1,'x'), (2,'y');
+---------------------+
| OBJECT_CONSTRUCT(*) |
|---------------------|
| {                   |
|   "COLUMN1": 1,     |
|   "COLUMN2": "x"    |
| }                   |
| {                   |
|   "COLUMN1": 2,     |
|   "COLUMN2": "y"    |
| }                   |
+---------------------+

In diesem Beispiel werden SQL NULL und die Zeichenfolge „null“ verwendet:

SELECT OBJECT_CONSTRUCT('Key_One', PARSE_JSON('NULL'), 'Key_Two', NULL, 'Key_Three', 'null') as obj;
+-----------------------+
| OBJ                   |
|-----------------------|
| {                     |
|   "Key_One": null,    |
|   "Key_Three": "null" |
| }                     |
+-----------------------+

OBJECT_CONSTRUCT unterstützt Ausdrücke und Abfragen zum Hinzufügen, Ändern oder Weglassen von Werten im JSON-Objekt.

SELECT OBJECT_CONSTRUCT(
    'foo', 1234567,
    'dataset_size', (SELECT COUNT(*) FROM demo_table_1),
    'distinct_province', (SELECT COUNT(DISTINCT province) FROM demo_table_1),
    'created_date_seconds', extract(epoch_seconds, created_date)
    )
    FROM demo_table_1;
+-------------------------------------------------------------------------------+
| OBJECT_CONSTRUCT(                                                             |
|     'FOO', 1234567,                                                           |
|     'DATASET_SIZE', (SELECT COUNT(*) FROM DEMO_TABLE_1),                      |
|     'DISTINCT_PROVINCE', (SELECT COUNT(DISTINCT PROVINCE) FROM DEMO_TABLE_1), |
|     'CREATED_DATE_SECONDS', EXTRACT(EPOCH_SECONDS, CREATED_DATE)              |
|     )                                                                         |
|-------------------------------------------------------------------------------|
| {                                                                             |
|   "created_date_seconds": 1579305600,                                         |
|   "dataset_size": 2,                                                          |
|   "distinct_province": 2,                                                     |
|   "foo": 1234567                                                              |
| }                                                                             |
| {                                                                             |
|   "created_date_seconds": 1579392000,                                         |
|   "dataset_size": 2,                                                          |
|   "distinct_province": 2,                                                     |
|   "foo": 1234567                                                              |
| }                                                                             |
+-------------------------------------------------------------------------------+