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( [<key>, <value> [, <key>, <value> , ...]] )

OBJECT_CONSTRUCT(*)
Copy

Argumentos

key

A chave em um par chave-valor. Cada chave é um valor VARCHAR.

value

O valor que está associado à chave. O valor pode ser qualquer tipo de dados.

*

Quando invocado com um asterisco (curinga), o valor de OBJECT é construído a partir dos dados especificados usando os nomes de atributo como chaves e os valores associados como valores. Consulte os exemplos abaixo.

Ao passar um curinga para a função, você pode qualificar o curinga com o nome ou alias da tabela. Por exemplo, para passar todas as colunas da tabela nomeadas mytable, especifique o seguinte:

(mytable.*)
Copy

Também é possível usar as palavras-chave ILIKE e EXCLUDE para filtrar:

  • ILIKE filtra nomes de colunas que correspondem ao padrão especificado. Apenas um padrão é permitido. Por exemplo:

    (* ILIKE 'col1%')
    
    Copy
  • EXCLUDE filtra nomes de coluna que não correspondem à coluna ou colunas especificadas. Por exemplo:

    (* EXCLUDE col1)
    
    (* EXCLUDE (col1, col2))
    
    Copy

Os qualificadores são válidos quando você usa essas palavras-chave. O exemplo a seguir usa a palavra-chave ILIKE para filtrar todas as colunas que correspondem ao padrão col1% na tabela mytable:

(mytable.* ILIKE 'col1%')
Copy

As palavras-chave ILIKE e EXCLUDE não podem ser combinadas em uma única chamada de função.

Também é possível especificar o curinga em uma constante de objeto.

Para esta função, as palavras-chave ILIKE e EXCLUDE são válidas somente em uma lista SELECT ou cláusula GROUP BY.

Para obter mais informações sobre as palavras-chave ILIKE e EXCLUDE, consulte a seção «Parâmetros» em SELECT.

Retornos

Retorna um valor do tipo OBJECT.

Notas de uso

  • Se a chave ou valor for NULL (isto é, SQL NULL), o par chave-valor será omitido do objeto resultante. Um par chave-valor consistindo de uma cadeia de caracteres diferente de NULL como a chave e um valor JSON nulo (ou seja, PARSE_JSON('NULL')) não é omitido. Para obter mais informações, consulte VARIANT 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

Este exemplo mostra como construir um objeto simples:

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

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

CREATE OR REPLACE TABLE demo_table_1 (province VARCHAR, created_date DATE);
INSERT INTO demo_table_1 (province, created_date) VALUES
  ('Manitoba', '2024-01-18'::DATE),
  ('Alberta', '2024-01-19'::DATE);
Copy
SELECT province, created_date
  FROM demo_table_1
  ORDER BY province;
Copy
+----------+--------------+
| PROVINCE | CREATED_DATE |
|----------+--------------|
| Alberta  | 2024-01-19   |
| Manitoba | 2024-01-18   |
+----------+--------------+
SELECT OBJECT_CONSTRUCT(*) AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+---------------------------------+
| OC                              |
|---------------------------------|
| {                               |
|   "CREATED_DATE": "2024-01-19", |
|   "PROVINCE": "Alberta"         |
| }                               |
| {                               |
|   "CREATED_DATE": "2024-01-18", |
|   "PROVINCE": "Manitoba"        |
| }                               |
+---------------------------------+

Este exemplo usa * e inclui a palavra-chave ILIKE para filtrar a saída:

SELECT OBJECT_CONSTRUCT(* ILIKE 'prov%') AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------+
| OC                       |
|--------------------------|
| {                        |
|   "PROVINCE": "Alberta"  |
| }                        |
| {                        |
|   "PROVINCE": "Manitoba" |
| }                        |
+--------------------------+

Este exemplo usa * e inclui a palavra-chave EXCLUDE para filtrar a saída:

SELECT OBJECT_CONSTRUCT(* EXCLUDE province) AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------------+
| OC                             |
|--------------------------------|
| {                              |
|   "CREATED_DATE": "2024-01-18" |
| }                              |
| {                              |
|   "CREATED_DATE": "2024-01-19" |
| }                              |
+--------------------------------+

Este exemplo é equivalente ao exemplo anterior, mas usa uma constante de objeto em vez da função OBJECT_CONSTRUCT:

SELECT {* EXCLUDE province} AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------------+
| OC                             |
|--------------------------------|
| {                              |
|   "CREATED_DATE": "2024-01-18" |
| }                              |
| {                              |
|   "CREATED_DATE": "2024-01-19" |
| }                              |
+--------------------------------+

Este é outro exemplo usando *. Neste caso, os nomes dos atributo não são especificados, então o Snowflake usa COLUMN1, COLUMN2 e assim por diante:

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

Este exemplo usa SQL NULL e a cadeia de caracteres 'null':

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

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)
  )  AS json_object
  FROM demo_table_1;
Copy
+---------------------------------------+
| JSON_OBJECT                           |
|---------------------------------------|
| {                                     |
|   "created_date_seconds": 1705536000, |
|   "dataset_size": 2,                  |
|   "distinct_province": 2,             |
|   "foo": 1234567                      |
| }                                     |
| {                                     |
|   "created_date_seconds": 1705622400, |
|   "dataset_size": 2,                  |
|   "distinct_province": 2,             |
|   "foo": 1234567                      |
| }                                     |
+---------------------------------------+