Categorias:

Funções de dados semiestruturados e estruturados (Matriz/objeto)

OBJECT_CONSTRUCT

Devolve um OBJECT construído a partir dos argumentos.

Consulte também:

OBJECT_CONSTRUCT_KEEP_NULL

Sintaxe

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

OBJECT_CONSTRUCT( * )
Copy

Retornos

O tipo de dados do valor retornado é OBJECT.

Notas de uso

  • A função aceita qualquer um dos dois:

    • Uma sequência de zero ou mais pares chave-valor (onde as chaves são cadeias de caracteres e os valores são de qualquer tipo).

    • Um asterisco. Quando invocado com um asterisco, o objeto é construído usando os nomes dos atributos como chaves e os valores de tupla associados como valores. Consulte os exemplos abaixo.

  • Se a chave ou valor for NULL (isto é, SQL NULL), o par chave-valor será omitido do objeto resultante. Um par chave-valor com uma cadeia de caracteres não nula como chave e um JSON NULL como valor (isto é, PARSE_JSON(“NULL”)).

  • O objeto construído não preserva necessariamente a ordem original dos pares chave-valor.

  • Em muitos contextos, você pode usar uma constante de OBJECT (também chamada de literal de OBJECT) em vez da função OBJECT_CONSTRUCT.

Exemplos

Isto mostra como criar um objeto simples:

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

Este exemplo usa * para obter o nome do atributo e o valor da cláusula FROM:

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);
Copy
SELECT province, created_date
    FROM demo_table_1
    ORDER BY province;
+----------+--------------+
| PROVINCE | CREATED_DATE |
|----------+--------------|
| Alberta  | 2020-01-19   |
| Manitoba | 2020-01-18   |
+----------+--------------+
Copy
SELECT OBJECT_CONSTRUCT(*) AS oc
    FROM demo_table_1
    ORDER BY oc['PROVINCE'];
+---------------------------------+
| OC                              |
|---------------------------------|
| {                               |
|   "CREATED_DATE": "2020-01-19", |
|   "PROVINCE": "Alberta"         |
| }                               |
| {                               |
|   "CREATED_DATE": "2020-01-18", |
|   "PROVINCE": "Manitoba"        |
| }                               |
+---------------------------------+
Copy

Este é outro exemplo usando *. Neste caso, os nomes dos atributos não são especificados, portanto, o Snowflake usa “COLUMN1”, “COLUMN2” etc:

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

Este exemplo usa SQL NULL e a cadeia de caracteres ‘nulo’:

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

OBJECT_CONSTRUCT oferece suporte a expressões e consultas para adicionar, modificar ou omitir valores do objeto JSON.

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                                                              |
| }                                                                             |
+-------------------------------------------------------------------------------+
Copy