Tipos de dados estruturados

Os tipos estruturados do Snowflake são ARRAY, OBJECT e MAP. Os tipos estruturados contêm elementos ou pares chave-valor com tipos de dados Snowflake específicos. A seguir estão exemplos de tipos estruturados:

  • Uma ARRAY de elementos INTEGER.

  • Um OBJECT com pares chave-valor VARCHAR e NUMBER.

  • Um MAP que associa uma chave VARCHAR a um valor DOUBLE.

Você pode usar tipos estruturados das seguintes maneiras:

  • É possível definir uma coluna de tipo estruturado em uma tabela Apache Iceberg™.

    Os tipos de dados Apache Iceberg™, list, struct e map correspondem aos tipos ARRAY estruturado, OBJECT estruturado e MAP no Snowflake.

    Uma coluna de tipo estruturado suporta no máximo 1000 subcolunas.

  • Você usa tipos estruturados ao acessar dados de uma coluna de tipo estruturado em uma tabela Iceberg.

  • É possível converter um valor semiestruturado ARRAY, OBJECT ou VARIANT em um tipo estruturado correspondente (por exemplo, um valor ARRAY em um valor ARRAY de elementos INTEGER). Você também pode converter um tipo estruturado de um tipo semiestruturado.

Nota

Atualmente, as tabelas que não sejam do tipo Iceberg não são compatíveis com tipos estruturados. Você não pode adicionar uma coluna de um tipo estruturado a uma tabela normal.

Este tópico explica como usar tipos estruturados no Snowflake.

Como especificar um tipo estruturado

Ao definir uma coluna de tipo estruturado ou converter um valor em um tipo estruturado, use a sintaxe descrita nas seções a seguir:

Como especificar um tipo ARRAY estruturado

Para especificar um tipo ARRAY estruturado, use a seguinte sintaxe:

ARRAY( <element_type> [ NOT NULL ] )
Copy

Onde:

  • element_type é o tipo de dados Snowflake dos elementos nesta ARRAY.

    Você também pode especificar uma ARRAY estruturada, um OBJECT estruturado ou um MAP como o tipo do elemento.

    Nota

    Na definição de uma coluna da tabela Iceberg, não é possível especificar um VARIANT, um ARRAY semiestruturado ou um OBJECT semiestruturado como o tipo do elemento ARRAY.

  • NOT NULL especifica que o ARRAY não pode conter nenhum elemento que seja NULL.

Por exemplo, compare os tipos retornados pela função SYSTEM$TYPEOF na instrução a seguir:

  • A expressão da primeira coluna converte um valor ARRAY semiestruturado em um valor ARRAY estruturado (um ARRAY de elementos NUMBER).

  • A expressão da segunda coluna especifica um valor ARRAY semiestruturado.

SELECT
  SYSTEM$TYPEOF(
    [1, 2, 3]::ARRAY(NUMBER)
  ) AS structured_array,
  SYSTEM$TYPEOF(
    [1, 2, 3]
  ) AS semi_structured_array;
Copy
+-------------------------------+-----------------------+
| STRUCTURED_ARRAY              | SEMI_STRUCTURED_ARRAY |
|-------------------------------+-----------------------|
| ARRAY(NUMBER(38,0))[LOB]      | ARRAY[LOB]            |
+-------------------------------+-----------------------+

Como especificar um tipo OBJECT estruturado

Para especificar um tipo OBJECT estruturado, use a seguinte sintaxe:

OBJECT(
  [
    <key> <value_type> [ NOT NULL ]
    [ , <key> <value_type> [ NOT NULL ] ]
    [ , ... ]
  ]
)
Copy

Onde:

  • key especifica uma chave para o tipo OBJECT.

    • Cada key em uma definição de OBJECT deve ser exclusivo.

    • A ordem das chaves faz parte da definição de OBJECT. Não é permitido comparar dois valores OBJECT que tenham as mesmas chaves em uma ordem diferente. (Ocorre um erro de tempo de compilação.)

    • Se você não especificar nenhuma chave, mas especificar os parênteses (ou seja, se usar OBJECT()), o tipo resultante será um OBJECT estruturado que não contém chaves. Um OBJECT estruturado sem chaves é diferente de um OBJECT semiestruturado.

  • value_type é o tipo de dados Snowflake do valor correspondente à chave.

    Você também pode especificar uma ARRAY estruturada, um OBJECT estruturado ou um MAP como o tipo de valor.

    Nota

    Na definição de uma coluna da tabela Iceberg, você não pode especificar um VARIANT, ARRAY semiestruturado ou OBJECT semiestruturado como o tipo do valor correspondente à chave OBJECT.

  • NOT NULL especifica que o valor correspondente à chave não pode ser NULL.

Por exemplo, compare os tipos retornados pela função SYSTEM$TYPEOF na instrução a seguir:

  • A expressão da primeira coluna converte um valor OBJECT semiestruturado em um valor OBJECT estruturado que contém as seguintes chaves e valores:

    • Uma chave chamada str com um valor VARCHAR que não é NULL.

    • Uma chave chamada num com um valor NUMBER.

  • A expressão da segunda coluna especifica um valor OBJECT semiestruturado.

SELECT
  SYSTEM$TYPEOF(
    {
      'str': 'test',
      'num': 1
    }::OBJECT(
      str VARCHAR NOT NULL,
      num NUMBER
    )
  ) AS structured_object,
  SYSTEM$TYPEOF(
    {
      'str': 'test',
      'num': 1
    }
  ) AS semi_structured_object;
Copy
+---------------------------------------------------------------+------------------------+
| STRUCTURED_OBJECT                                             | SEMI_STRUCTURED_OBJECT |
|---------------------------------------------------------------+------------------------|
| OBJECT(str VARCHAR(16777216) NOT NULL, num NUMBER(38,0))[LOB] | OBJECT[LOB]            |
+---------------------------------------------------------------+------------------------+

Especificando um tipo de MAP

Para especificar um tipo de MAP, use a seguinte sintaxe:

MAP( <key_type> , <value_type> [ NOT NULL ] )
Copy

Onde:

  • key_type é o tipo de dados Snowflake da chave do mapa. Você deve usar um dos seguintes tipos de chaves:

    • VARCHAR

    • NUMBER com a escala 0

    Você não pode usar um tipo de dados de ponto flutuante como o tipo da chave.

    As chaves do mapa não podem ser NULL.

  • value_type é o tipo de dados Snowflake dos valores no mapa.

    Você também pode especificar uma ARRAY estruturada, um OBJECT estruturado ou um MAP como o tipo de valores.

    Nota

    Na definição de uma coluna da tabela Iceberg, você não pode especificar um VARIANT, um ARRAY semiestruturado ou um OBJECT semiestruturado como o tipo do valor no MAP.

  • NOT NULL especifica que o valor correspondente à chave não pode ser NULL.

O exemplo a seguir converte um valor OBJECT semiestruturado em um valor MAP e usa a função SYSTEM$TYPEOF para imprimir o tipo resultante do valor. O MAP associa chaves VARCHAR a valores VARCHAR.

SELECT
  SYSTEM$TYPEOF(
    {
      'a_key': 'a_val',
      'b_key': 'b_val'
    }::MAP(VARCHAR, VARCHAR)
  ) AS map_example;
Copy
+------------------------------------------------+
| MAP_EXAMPLE                                    |
|------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+

Como usar tipos estruturados em tipos semiestruturados

Você não pode usar um valor MAP, OBJECT estruturado ou ARRAY estruturado em um valor VARIANT, OBJECT semiestruturado ou ARRAY semiestruturado. Um erro ocorre nas seguintes situações:

  • Você usa um valor MAP, OBJECT estruturado ou ARRAY estruturado em uma constante OBJECT ou ARRAY.

  • Você passa um valor MAP, OBJECT estruturado ou ARRAY estruturado para uma função de construtor OBJECT ou ARRAY.

Conversão de tipos estruturados e semiestruturados

A tabela a seguir resume as regras para converter valores OBJECT estruturados, ARRAY estruturados e MAP em valores OBJECT, ARRAY e VARIANT semiestruturados (e vice-versa).

Tipo de dados de origem

Tipo de dados de destino

Conversível

Coercível

ARRAY semiestruturado

ARRAY estruturada

OBJECT semiestruturado

  • OBJECT estruturado

  • MAP

VARIANT semiestruturado

  • ARRAY estruturada

  • OBJECT estruturado

  • MAP

ARRAY estruturada

ARRAY semiestruturado

  • OBJECT estruturado

  • MAP

OBJECT semiestruturado

  • ARRAY estruturada

  • OBJECT estruturado

  • MAP

VARIANT semiestruturado

As seções seguintes explicam essas regras com mais detalhes.

Conversão explícita de um tipo semiestruturado em um tipo estruturado

Para converter explicitamente um valor de um tipo semiestruturado em um valor de um tipo estruturado, é possível chamar a função CAST ou usar o operador ::.

Nota

TRY_CAST não é compatível com tipos estruturados.

Só é possível converter valores dos seguintes tipos semiestruturados em valores do tipo estruturado correspondente; caso contrário, ocorrerá um erro de tempo de execução.

Tipo semiestruturado

Tipo estruturado no qual é possível converter

ARRAY

ARRAY estruturada

OBJECT

MAP ou OBJECT estruturado

VARIANT

MAP ou ARRAY ou OBJECT estruturado

As próximas seções fornecem mais detalhes sobre como os tipos são convertidos:

Converter valores semiestruturados de ARRAY e VARIANT em valores ARRAY estruturados

As etapas a seguir demonstram como converter um valor semiestruturado ARRAY ou VARIANT em um valor ARRAY de elementos NUMBER:

SELECT
  SYSTEM$TYPEOF(
    CAST ([1,2,3] AS ARRAY(NUMBER))
  ) AS array_cast_type,
  SYSTEM$TYPEOF(
    CAST ([1,2,3]::VARIANT AS ARRAY(NUMBER))
  ) AS variant_cast_type;
Copy

Ou:

SELECT
  SYSTEM$TYPEOF(
    [1,2,3]::ARRAY(NUMBER)
  ) AS array_cast_type,
  SYSTEM$TYPEOF(
    [1,2,3]::VARIANT::ARRAY(NUMBER)
  ) AS variant_cast_type;
Copy
+--------------------------+--------------------------+
| ARRAY_CAST_TYPE          | VARIANT_CAST_TYPE        |
|--------------------------+--------------------------|
| ARRAY(NUMBER(38,0))[LOB] | ARRAY(NUMBER(38,0))[LOB] |
+--------------------------+--------------------------+

Ao converter um valor ARRAY ou VARIANT semiestruturado em um valor ARRAY estruturado, observe o seguinte:

  • Cada elemento do valor ARRAY é convertido para o tipo especificado do ARRAY.

    A conversão da coluna ARRAY para ARRAY(VARCHAR) converte cada valor em um valor VARCHAR:

    SELECT
      CAST ([1,2,3] AS ARRAY(VARCHAR)) AS varchar_array,
      SYSTEM$TYPEOF(varchar_array) AS array_cast_type;
    
    Copy
    +---------------+-------------------------------+
    | VARCHAR_ARRAY | ARRAY_CAST_TYPE               |
    |---------------+-------------------------------|
    | [             | ARRAY(VARCHAR(16777216))[LOB] |
    |   "1",        |                               |
    |   "2",        |                               |
    |   "3"         |                               |
    | ]             |                               |
    +---------------+-------------------------------+
    
  • Se o elemento não puder ser convertido para o tipo especificado (por exemplo, converter ['a', 'b', 'c'] para ARRAY(NUMBER)), a conversão falhará.

  • Se o valor ARRAY contiver elementos NULL e o tipo ARRAY especificar NOT NULL (por exemplo, converter [1, NULL, 3] em ARRAY(NUMBER NOT NULL), a conversão falhará.

  • Os elementos que forem valores nulos JSON serão convertidos para NULL, se o tipo de elemento de destino não suportar nulos JSON (ou seja, o tipo de destino não é um ARRAY, OBJECT, ou VARIANT semiestruturado).

    Por exemplo, se você estiver convertendo para ARRAY(NUMBER), os valores nulos JSON serão convertidos para NULL porque NUMBER não oferece suporte a nulos JSON.

    Por outro lado, se você estiver convertendo para ARRAY(VARIANT), os valores nulos JSON não serão convertidos para NULL porque VARIANT oferece suporte a nulos JSON.

Converter valores semiestruturados de OBJECT e VARIANT em valores OBJECT estruturados

As etapas a seguir demonstram como converter um valor OBJECT ou VARIANT semiestruturado em um valor OBJECT estruturado contendo os pares chave-valor city e state (que são valores VARCHAR):

SELECT
  SYSTEM$TYPEOF(
    CAST ({'city':'San Mateo','state':'CA'} AS OBJECT(city VARCHAR, state VARCHAR))
  ) AS object_cast_type,
  SYSTEM$TYPEOF(
    CAST ({'city':'San Mateo','state':'CA'}::VARIANT AS OBJECT(city VARCHAR, state VARCHAR))
  ) AS variant_cast_type;
Copy

Ou:

SELECT
  SYSTEM$TYPEOF(
     {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  ) AS object_cast_type,
  SYSTEM$TYPEOF(
     {'city':'San Mateo','state':'CA'}::VARIANT::OBJECT(city VARCHAR, state VARCHAR)
  ) AS variant_cast_type;
Copy
+--------------------------------------------------------------+--------------------------------------------------------------+
| OBJECT_CAST_TYPE                                             | VARIANT_CAST_TYPE                                            |
|--------------------------------------------------------------+--------------------------------------------------------------|
| OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] |
+--------------------------------------------------------------+--------------------------------------------------------------+

Ao converter um valor OBJECT ou VARIANT semiestruturado em um valor OBJECT estruturado, observe o seguinte:

  • O valor OBJECT não pode conter nenhuma chave adicional que não esteja especificada no tipo OBJECT.

    Se houver chaves adicionais, a conversão falhará.

  • Se o valor OBJECT não tiver uma chave especificada no tipo OBJECT, a conversão falhará.

  • O valor de cada chave no valor OBJECT é convertido para o tipo especificado para essa chave.

    Se um valor não puder ser convertido para o tipo especificado, a conversão falhará.

  • Se o valor de uma chave for um valor nulo JSON, o valor será convertido para NULL quando o tipo de valor de destino não for compatível com nulos JSON (ou seja, o tipo de destino não for um ARRAY, OBJECT ou VARIANT semiestruturado).

    Por exemplo, se você estiver fazendo a conversão para OBJECT(city VARCHAR), os valores nulos JSON serão convertidos para NULL porque VARCHAR não oferece suporte a nulos JSON.

    Por outro lado, se você estiver fazendo a conversão para OBJECT(city VARIANT), os valores nulos JSON não serão convertidos para NULL porque VARIANT aceita nulos JSON.

Como converter valores OBJECT e VARIANT semiestruturados em valores MAP

As instruções a seguir demonstram como converter um valor OBJECT ou VARIANT semiestruturado em um valor MAP que associa uma chave VARCHAR a um valor VARCHAR:

SELECT
  SYSTEM$TYPEOF(
    CAST ({'my_key':'my_value'} AS MAP(VARCHAR, VARCHAR))
  ) AS map_cast_type,
  SYSTEM$TYPEOF(
    CAST ({'my_key':'my_value'} AS MAP(VARCHAR, VARCHAR))
  ) AS variant_cast_type;
Copy

Ou:

SELECT
  SYSTEM$TYPEOF(
    {'my_key':'my_value'}::MAP(VARCHAR, VARCHAR)
  ) AS map_cast_type,
  SYSTEM$TYPEOF(
    {'my_key':'my_value'}::VARIANT::MAP(VARCHAR, VARCHAR)
  ) AS variant_cast_type;
Copy
+------------------------------------------------+------------------------------------------------+
| MAP_CAST_TYPE                                  | VARIANT_CAST_TYPE                              |
|------------------------------------------------+------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] | MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+------------------------------------------------+

Ao converter um valor OBJECT ou VARIANT semiestruturado em um valor MAP, observe o seguinte:

  • Se as chaves e os valores não corresponderem aos tipos especificados, as chaves e os valores serão convertidos nos tipos especificados.

  • Se as chaves e os valores não puderem ser convertidos para os tipos especificados, a conversão falhará.

  • Se o valor de uma chave for um valor nulo JSON, o valor será convertido para NULL quando o tipo de valor de destino não for compatível com nulos JSON (ou seja, o tipo de destino não for um ARRAY, OBJECT ou VARIANT semiestruturado).

    Por exemplo, se você estiver convertendo para MAP(VARCHAR, VARCHAR), os valores nulos JSON serão convertidos para NULL porque VARCHAR não oferece suporte a nulos JSON.

    Por outro lado, se você estiver fazendo a conversão para MAP(VARCHAR, VARIANT), os valores nulos JSON não serão convertidos para NULL porque VARIANT aceita nulos JSON.

Conversão explícita de um tipo estruturado em um tipo semiestruturado

Para converter explicitamente um valor de um tipo estruturado em um valor de um tipo semiestruturado, é possível chamar a função CAST, usar o operador :: ou chamar uma das funções de conversão (por exemplo, TO_ARRAY, TO_OBJECT ou TO_VARIANT).

Nota

TRY_CAST não é compatível com tipos estruturados.

Tipo estruturado

Tipo semiestruturado no qual é possível converter

ARRAY estruturada

ARRAY

MAP ou OBJECT estruturado

OBJECT

MAP, ARRAY estruturada ou OBJECT estruturado

VARIANT

Por exemplo:

  • Se col_structured_array for do tipo ARRAY(VARCHAR):

    • CAST(col_structured_array AS ARRAY) retorna um valor ARRAY semiestruturado.

    • CAST(col_structured_array AS VARIANT) retorna um valor VARIANT que contém um valor ARRAY semiestruturado.

  • Se col_structured_object for OBJECT(nome VARCHAR, estado VARCHAR), digite:

    • CAST(col_structured_object AS OBJECT) retorna um valor OBJECT semiestruturado.

    • CAST(col_structured_object AS VARIANT) retorna um valor VARIANT que contém um valor OBJECT semiestruturado.

  • Se col_map for do tipo MAP(VARCHAR, VARCHAR):

    • CAST(col_map AS OBJECT) retorna um valor OBJECT semiestruturado.

    • CAST(col_map AS VARIANT) retorna um valor VARIANT que contém um valor OBJECT semiestruturado.

Observe o seguinte:

  • Ao converter para um valor OBJECT semiestruturado, a ordem das chaves no valor OBJECT estruturado não é preservada.

  • Ao converter um valor estruturado OBJECT ou MAP em um valor semiestruturado OBJECT ou VARIANT, todos os valores NULL serão convertidos em valores nulos JSON.

    Se você estiver convertendo um valor ARRAY estruturado em um valor VARIANT, os valores NULL serão preservados como estão.

    SELECT [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT;
    
    Copy
    +---------------------------------------+
    | [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT |
    |---------------------------------------|
    | [                                     |
    |   1,                                  |
    |   2,                                  |
    |   undefined,                          |
    |   3                                   |
    | ]                                     |
    +---------------------------------------+
    
  • Se você estiver convertendo um valor MAP que usa um tipo NUMBER para chaves, as chaves MAP serão convertidas em cadeias de caracteres no valor OBJECT retornado.

Conversão implícita de um valor (coerção)

As regras a seguir se aplicam à conversão (coerção) implícita de um valor de um tipo estruturado para um valor de outro tipo estruturado:

  • Um valor de tipo estruturado pode ser convertido a outro valor de tipo estruturado se os dois tipos básicos forem os mesmos:

    • Um valor ARRAY de um tipo pode ser convertido a um valor ARRAY de outro tipo, desde que o primeiro tipo de elemento possa ser convertido para o segundo tipo de elemento.

      Um tipo de elemento pode ser forçado a outro tipo de elemento em qualquer um dos seguintes casos:

      • Ambos os tipos são numéricos. Os seguintes casos são suportados:

        • Ambos usam o mesmo tipo numérico, mas possivelmente diferem em precisão e/ou escala.

        • Como forçar NUMBER a FLOAT (e vice-versa).

      • Ambos os tipos são carimbos de data/hora. Os seguintes casos são suportados:

        • Ambos usam o mesmo tipo, mas possivelmente diferem em precisão.

        • Como forçar TIMESTAMP_LTZ a TIMESTAMP_TZ (e vice-versa).

      Por exemplo:

      • Um valor ARRAY(NUMBER) pode ser convertido para um valor ARRAY(DOUBLE).

      • Um valor ARRAY(DATE) não pode ser convertido para um valor ARRAY(NUMBER).

    • Um valor OBJECT com uma definição de tipo pode ser convertido para um valor OBJECT com outra definição de tipo apenas se todas as seguintes condições forem atendidas:

      • Ambos os tipos de OBJECT têm o mesmo número de chaves.

      • Ambos os tipos de OBJECT usam os mesmos nomes para chaves.

      • As chaves em ambos os tipos de OBJECT estão na mesma ordem.

      • O tipo de cada valor em um tipo de OBJECT pode ser forçado para o tipo do valor correspondente no outro tipo de OBJECT.

        Assim como ocorre com os tipos de elementos em valores ARRAY estruturados, você só pode converter o tipo de um valor para outro tipo se:

        • Ambos os tipos são numéricos. Os seguintes casos são suportados:

          • Ambos usam o mesmo tipo numérico, mas possivelmente diferem em precisão e/ou escala.

          • Como forçar NUMBER a FLOAT (e vice-versa).

        • Ambos os tipos são carimbos de data/hora. Os seguintes casos são suportados:

          • Ambos usam o mesmo tipo, mas possivelmente diferem em precisão.

          • Como forçar TIMESTAMP_LTZ a TIMESTAMP_TZ (e vice-versa).

      Por exemplo:

      • Um valor OBJECT(city VARCHAR, zipcode NUMBER) pode ser convertido para um valor OBJECT(city VARCHAR, zipcode DOUBLE).

      • Um valor OBJECT(city VARCHAR, zipcode NUMBER) não pode ser convertido para um valor OBJECT(city VARCHAR, zipcode DATE).

    • Um valor MAP com um tipo de valor pode ser convertido para um valor MAP com um tipo de valor diferente se:

      • Ambos os tipos de valor forem numéricos. Os seguintes casos são suportados:

        • Ambos usam o mesmo tipo numérico, mas possivelmente diferem em precisão e/ou escala.

        • Como forçar NUMBER a FLOAT (e vice-versa).

      • Ambos os tipos de valor forem carimbos de data/hora. Os seguintes casos são suportados:

        • Ambos usam o mesmo tipo, mas possivelmente diferem em precisão.

        • Como forçar TIMESTAMP_LTZ a TIMESTAMP_TZ (e vice-versa).

      Por exemplo, um valor MAP(VARCHAR, NUMBER) pode ser convertido para um valor MAP(VARCHAR, DOUBLE).

    • Um valor MAP com um tipo de chave pode ser convertido para um valor MAP com um tipo de chave diferente se ambos os tipos de chave usarem o mesmo tipo de inteiro NUMERIC que difere apenas na precisão.

      Por exemplo, um valor MAP(VARCHAR, NUMBER) não pode ser convertido para um valor MAP(NUMBER, NUMBER).

  • Um valor de tipo estruturado não pode ser coagido a um valor semiestruturado (e vice-versa).

  • Um valor VARCHAR não pode ser convertido para um valor de tipo estruturado.

Conversão de um tipo estruturado em outro

É possível chamar a função CAST ou usar o operador :: para converter um valor de um tipo estruturado em um valor de outro tipo estruturado. É possível converter valores de e para os seguintes tipos estruturados:

Nota

TRY_CAST não é compatível com tipos estruturados.

Se não for possível converter os valores de um tipo para o outro, a conversão falhará. Por exemplo, a tentativa de converter um valor ARRAY(BOOLEAN) em um valor ARRAY(DATE) falha.

Exemplo: conversão de um tipo de valor ARRAY para outro

O exemplo a seguir converte um valor ARRAY(NUMBER) em um valor ARRAY(VARCHAR):

SELECT CAST(
  CAST([1,2,3] AS ARRAY(NUMBER))
  AS ARRAY(VARCHAR)) AS cast_array;
Copy
+------------+
| CAST_ARRAY |
|------------|
| [          |
|   "1",     |
|   "2",     |
|   "3"      |
| ]          |
+------------+

Exemplo: alteração da ordem dos pares chave-valor em um valor OBJECT

O exemplo a seguir altera a ordem dos pares chave-valor em um valor OBJECT estruturado:

SELECT CAST(
  {'city': 'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(state VARCHAR, city VARCHAR)) AS object_value_order;
Copy
+-----------------------+
| OBJECT_VALUE_ORDER    |
|-----------------------|
| {                     |
|   "state": "CA",      |
|   "city": "San Mateo" |
| }                     |
+-----------------------+

Exemplo: alteração dos nomes de chave em um valor OBJECT

Para alterar os nomes das chaves em um valor OBJECT estruturado, especifique as palavras-chave RENAME FIELDS no final de CAST. Por exemplo:

SELECT CAST({'city':'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(city_name VARCHAR, state_name VARCHAR) RENAME FIELDS) AS object_value_key_names;
Copy
+-----------------------------+
| OBJECT_VALUE_KEY_NAMES      |
|-----------------------------|
| {                           |
|   "city_name": "San Mateo", |
|   "state_name": "CA"        |
| }                           |
+-----------------------------+

Exemplo: adição de chaves a um valor OBJECT

Se o tipo para o qual você está fazendo a conversão tiver pares chave-valor adicionais que não estejam presentes no valor original estruturado OBJECT, especifique as palavras-chave ADD FIELDS no final de CAST. Por exemplo:

SELECT CAST({'city':'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(city VARCHAR, state VARCHAR, zipcode NUMBER) ADD FIELDS) AS add_fields;
Copy
+------------------------+
| ADD_FIELDS             |
|------------------------|
| {                      |
|   "city": "San Mateo", |
|   "state": "CA",       |
|   "zipcode": null      |
| }                      |
+------------------------+

Os valores das chaves recém-adicionadas são definidos como NULL. Se você quiser atribuir um valor a essas chaves, chame a função OBJECT_INSERT.

Construção de valores estruturados ARRAY, OBJECT e MAP

As seções a seguir explicam como construir os valores estruturados ARRAY, OBJECT e MAP.

Uso das funções SQL para construir valores estruturados ARRAY e OBJECT

As seguintes funções constroem valores semiestruturados ARRAY:

As seguintes funções constroem valores semiestruturados OBJECT:

Para construir um valor estruturado ARRAY ou OBJECT, use essas funções e converta explicitamente o valor de retorno da função. Por exemplo:

SELECT ARRAY_CONSTRUCT(10, 20, 30)::ARRAY(NUMBER);
Copy
SELECT OBJECT_CONSTRUCT(
  'oname', 'abc',
  'created_date', '2020-01-18'::DATE
)::OBJECT(
  oname VARCHAR,
  created_date DATE
);
Copy

Para obter mais detalhes, consulte Conversão explícita de um tipo semiestruturado em um tipo estruturado.

Nota

Você não pode passar valores ARRAY estruturado, OBJECT estruturado ou MAP para essas funções. Isso resultaria em um tipo estruturado sendo implicitamente convertido em um tipo semiestruturado, o que não é permitido, conforme observado em Conversão implícita de um valor (coerção).

Como usar constantes ARRAY e OBJECT para construir valores estruturados ARRAY e OBJECT

Ao especificar uma constante ARRAY ou uma constante OBJECT, está especificando um valor semiestruturado ARRAY ou OBJECT.

Para construir um valor estruturado ARRAY ou OBJECT, é necessário converter explicitamente a expressão. Por exemplo:

SELECT [10, 20, 30]::ARRAY(NUMBER);
Copy
SELECT {
  'oname': 'abc',
  'created_date': '2020-01-18'::DATE
}::OBJECT(
  oname VARCHAR,
  created_date DATE
);
Copy

Para obter mais detalhes, consulte Conversão explícita de um tipo semiestruturado em um tipo estruturado.

Construção de um valor MAP

Para criar um valor MAP, construa um valor semiestruturado OBJECT e converta o valor OBJECT em um valor MAP.

Por exemplo, as instruções a seguir produzem o valor MAP {'city'->'San Mateo','state'->'CA'}:

SELECT OBJECT_CONSTRUCT(
  'city', 'San Mateo',
  'state', 'CA'
)::MAP(
  VARCHAR,
  VARCHAR
);
Copy
SELECT {
  'city': 'San Mateo',
  'state': 'CA'
}::MAP(
  VARCHAR,
  VARCHAR
);
Copy

A seguinte instrução produz o valor MAP {-10->'CA',-20->'OR'}:

SELECT {
  '-10': 'CA',
  '-20': 'OR'
}::MAP(
  NUMBER,
  VARCHAR
);
Copy

Para obter mais detalhes, consulte Como converter valores OBJECT e VARIANT semiestruturados em valores MAP.

Trabalho com chaves, valores e elementos em valores de tipos estruturados

As seções a seguir explicam como usar chaves, valores e elementos em valores de tipos estruturados.

Como obter a lista de chaves de um valor estruturado OBJECT

Para obter a lista de chaves em um valor OBJECT estruturado, chame a função OBJECT_KEYS:

SELECT OBJECT_KEYS({'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR));
Copy

Se a entrada for um valor OBJECT estruturado, a função retornará um valor ARRAY(VARCHAR) contendo as chaves. Se a entrada for um valor OBJECT semiestruturado, a função retornará um valor ARRAY.

Como obter a lista de chaves de um valor MAP

Para obter a lista de chaves em um valor MAP, chame a função MAP_KEYS:

SELECT MAP_KEYS({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Copy

Acesso a valores e elementos a partir de valores de tipos estruturados

É possível usar os seguintes métodos para acessar valores e elementos dos valores estruturados ARRAY, OBJECT e MAP:

Os valores e elementos retornados têm o tipo especificado para o valor estruturado, em vez de VARIANT.

O exemplo a seguir passa o primeiro elemento de um valor ARRAY semiestruturado e um valor ARRAY(VARCHAR) para a função SYSTEM$TYPEOF para retornar o tipo de dados desse elemento:

SELECT
  SYSTEM$TYPEOF(
    ARRAY_CONSTRUCT('San Mateo')[0]
  ) AS semi_structured_array_element,
  SYSTEM$TYPEOF(
    CAST(
      ARRAY_CONSTRUCT('San Mateo') AS ARRAY(VARCHAR)
    )[0]
  ) AS structured_array_element;
Copy
+-------------------------------+-----------------------------+
| SEMI_STRUCTURED_ARRAY_ELEMENT | STRUCTURED_ARRAY_ELEMENT    |
|-------------------------------+-----------------------------|
| VARIANT[LOB]                  | VARCHAR(16777216)[LOB]      |
+-------------------------------+-----------------------------+

Observe o seguinte:

  • Ao passar um valor estruturado OBJECT para a função GET ou GET_IGNORE_CASE, é necessário especificar uma constante para a chave.

    Não é necessário especificar uma constante se você estiver passando um valor MAP ou ARRAY estruturado para a função GET.

    Também não é necessário especificar uma constante se você estiver passando um valor MAP para a função GET_IGNORE_CASE.

  • Ao passar um valor OBJECT estruturado, ARRAY estruturado ou MAP para a função GET_PATH, é necessário especificar uma constante para o nome do caminho.

  • Para um valor OBJECT estruturado, se você usar uma chave OBJECT ou um caminho inexistente, ocorrerá um erro de tempo de compilação.

    Por outro lado, quando você usa um índice, uma chave ou um caminho que não existe com um valor OBJECT semiestruturado, a função retorna NULL.

Determinação do tamanho de um valor ARRAY estruturado

Para determinar o tamanho de um valor ARRAY estruturado, passe o valor ARRAY para a função ARRAY_SIZE:

SELECT ARRAY_SIZE([1,2,3]::ARRAY(NUMBER));
Copy

Determinação do tamanho de um valor MAP

Para determinar o tamanho de um valor MAP, passe o valor MAP para a função MAP_SIZE:

SELECT MAP_SIZE({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Copy

Consulta de elementos em um valor ARRAY estruturado

Para determinar se um elemento está presente em um valor ARRAY estruturado, chame a função ARRAY_CONTAINS. Por exemplo:

SELECT ARRAY_CONTAINS(10, [1, 10, 100]::ARRAY(NUMBER));
Copy

Para determinar a posição de um elemento em um valor ARRAY estruturado, chame a função ARRAY_POSITION. Por exemplo:

SELECT ARRAY_POSITION(10, [1, 10, 100]::ARRAY(NUMBER));
Copy

Nota

Para ambas as funções, use um elemento de um tipo que seja comparável ao tipo do valor ARRAY.

Não converta a expressão do elemento em um valor VARIANT.

Como determinar se um valor MAP contém uma chave

Para determinar se um valor MAP contém uma chave, chame a função MAP_CONTAINS_KEY:

Por exemplo:

SELECT MAP_CONTAINS_KEY('key_to_find', my_map);
Copy
SELECT MAP_CONTAINS_KEY(10, my_map);
Copy

Comparação de valores

As seções a seguir explicam como comparar valores:

Comparação de valores estruturados com valores semiestruturados

Você não pode comparar um valor ARRAY estruturado, OBJECT estruturado ou MAP com um valor semiestruturado ARRAY, OBJECT ou VARIANT.

Comparação de valores estruturados com outros valores estruturados

É possível comparar dois valores do mesmo tipo (por exemplo, dois valores ARRAY estruturados, dois valores OBJECT estruturados ou dois valores MAP).

Atualmente, os seguintes operadores de comparação são compatíveis com a comparação de valores de tipos estruturados:

  • =

  • !=

  • <

  • <=

  • >=

  • >

Ao comparar dois valores estruturados para igualdade, observe o seguinte:

  • Se um tipo não puder ser convertido para outro tipo, a comparação falha.

  • Ao comparar os valores MAP que têm chaves numéricas, as chaves são comparadas como números (e não como valores VARCHAR).

Ao comparar dois valores estruturados usando <, <=, >= ou >, os campos de valores estruturados são comparados em ordem alfabética. Por exemplo, o valor a seguir:

{'a':2,'b':1}::OBJECT(b INTEGER,a INTEGER)
Copy

é maior que:

{'a':1,'b':2}::OBJECT(b INTEGER,a INTEGER)
Copy

Como determinar se dois valores ARRAY se sobrepõem

Para determinar se os elementos de dois valores ARRAY estruturados se sobrepõem, chame a função ARRAYS_OVERLAP. Por exemplo:

SELECT ARRAYS_OVERLAP(numeric_array, other_numeric_array);
Copy

Os valores ARRAY devem ser de tipos comparáveis.

Você não pode passar um valor ARRAY semiestruturado e um valor ARRAY estruturado para essa função. Ambos os valores ARRAY devem ser estruturados ou semiestruturados.

Transformando valores de tipos estruturados

As seções a seguir explicam como transformar os valores ARRAY estruturado, OBJECT estruturado e MAP:

Transformação de valores ARRAY estruturados

Ao passar um valor ARRAY estruturado para essas funções, elas retornam um valor ARRAY estruturado do mesmo tipo:

As próximas seções explicam como essas funções funcionam com os valores ARRAY estruturados.

Funções que adicionam elementos aos valores ARRAY

As seguintes funções adicionam elementos a um valor ARRAY:

Para essas funções, o tipo do elemento deve ser compatível com o tipo do valor ARRAY.

Por exemplo, a chamada a seguir é bem-sucedida porque um valor NUMBER pode ser convertido a um valor DOUBLE (o tipo do valor ARRAY):

SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), 3::NUMBER );
Copy

A chamada a seguir é bem-sucedida porque os valores VARCHAR podem ser convertidos em valores DOUBLE:

SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), '3' );
Copy

A chamada a seguir falha porque os valores DATE não podem ser convertidos em valores NUMBER:

SELECT ARRAY_APPEND( [1,2]::ARRAY(NUMBER), '2022-02-02'::DATE );
Copy

Funções que aceitam múltiplos valores ARRAY como entrada

As funções a seguir aceitam vários valores ARRAY como argumentos de entrada:

Ao chamar essas funções, ambos os argumentos devem ser valores ARRAY estruturados ou valores ARRAY semiestruturados. Por exemplo, as chamadas a seguir falham porque um argumento é um valor ARRAY estruturado e o outro argumento é um valor ARRAY semiestruturado:

SELECT ARRAY_CAT( [1,2]::ARRAY(NUMBER), ['3','4'] );
Copy
SELECT ARRAY_CAT( [1,2], ['3','4']::ARRAY(VARCHAR) );
Copy

A função ARRAY_EXCEPT retorna um valor ARRAY do mesmo tipo que o valor ARRAY no primeiro argumento.

As funções ARRAY_CAT e ARRAY_INTERSECTION retornam um valor ARRAY de um tipo que pode acomodar os tipos de ambos os valores de entrada.

Por exemplo, a seguinte chamada para ARRAY_CAT passa dois valores ARRAY estruturados:

  • O primeiro valor ARRAY estruturado não permite NULLs e contém valores NUMBER com a escala de 0 (NUMBER(38, 0)).

  • O segundo valor ARRAY estruturado contém um valor NULL e um valor NUMBER com escala 1.

O valor ARRAY retornado por ARRAY_CAT permite NULLs e contém valores NUMBER com escala 1.

SELECT
  ARRAY_CAT(
    [1, 2, 3]::ARRAY(NUMBER NOT NULL),
    [5.5, NULL]::ARRAY(NUMBER(2, 1))
  ) AS concatenated_array,
  SYSTEM$TYPEOF(concatenated_array);
Copy
+--------------------+-----------------------------------+
| CONCATENATED_ARRAY | SYSTEM$TYPEOF(CONCATENATED_ARRAY) |
|--------------------+-----------------------------------|
| [                  | ARRAY(NUMBER(38,1))[LOB]          |
|   1,               |                                   |
|   2,               |                                   |
|   3,               |                                   |
|   5.5,             |                                   |
|   undefined        |                                   |
| ]                  |                                   |
+--------------------+-----------------------------------+

Para a função ARRAY_CAT, o valor ARRAY no segundo argumento deve ser coercível com o tipo no primeiro argumento.

Para as funções ARRAY_EXCEPT e ARRAY_INTERSECTION, o valor ARRAY no segundo argumento deve ser comparável ao valor ARRAY no primeiro argumento.

Por exemplo, a chamada a seguir é bem-sucedida porque um valor ARRAY(NUMBER) é comparável a um valor ARRAY(DOUBLE):

SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), [2,3]::ARRAY(DOUBLE) );
Copy

A chamada a seguir falha porque um valor ARRAY(NUMBER) não é comparável a um valor ARRAY(VARCHAR):

SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), ['2','3']::ARRAY(VARCHAR) );
Copy

Transformação de valores OBJECT estruturados

As seções a seguir explicam como retornar um valor OBJECT estruturado que foi transformado a partir de outro valor OBJECT:

Para alterar a ordem dos pares chave-valor, renomear chaves ou adicionar chaves sem especificar valores, use a função CAST ou o operador ::. Para obter mais detalhes, consulte Conversão de um tipo estruturado em outro.

Remoção dos pares chave-valor

Para retornar um novo valor OBJECT que contenha os pares chave-valor de um valor OBJECT existente com pares chave-valor específicos removidos, chame a função OBJECT_DELETE.

Ao chamar esta função, observe o seguinte:

  • Para os argumentos que são chaves, você deve especificar constantes.

  • Se a chave especificada não fizer parte da definição do tipo OBJECT, a chamada falhará. Por exemplo, a chamada a seguir falha porque o valor OBJECT não contém a chave especificada zip_code:

    SELECT OBJECT_DELETE( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'zip_code' );
    
    Copy
    093201 (23001): Function OBJECT_DELETE: expected structured object to contain field zip_code but it did not.
    
  • A função retorna um valor OBJECT estruturado. O tipo do valor OBJECT exclui a chave excluída. Por exemplo, suponha que você remova a chave city:

    SELECT
      OBJECT_DELETE(
        {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
        'city'
      ) AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy

    A função retorna um valor OBJECT do tipo OBJECT(state VARCHAR), que não inclui a chave city.

    +-----------------+--------------------------------------+
    | NEW_OBJECT      | SYSTEM$TYPEOF(NEW_OBJECT)            |
    |-----------------+--------------------------------------|
    | {               | OBJECT(state VARCHAR(16777216))[LOB] |
    |   "state": "CA" |                                      |
    | }               |                                      |
    +-----------------+--------------------------------------+
    
  • Se a função remover todas as chaves do valor OBJECT, a função retornará um valor OBJECT estruturado vazio do tipo OBJECT().

    SELECT
      OBJECT_DELETE(
        {'state':'CA'}::OBJECT(state VARCHAR),
        'state'
      ) AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy
    +------------+---------------------------+
    | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) |
    |------------+---------------------------|
    | {}         | OBJECT()[LOB]             |
    +------------+---------------------------+
    

    Quando o tipo de um valor OBJECT estruturado inclui pares chave-valor, os nomes e tipos desses pares são incluídos entre parênteses no tipo (por exemplo, OBJECT(city VARCHAR)). Como um valor OBJECT estruturado vazio não contém pares chave-valor, os parênteses estão vazios.

Inserção de pares chave-valor e atualização de valores

Para retornar um novo valor OBJECT que contenha os pares chave-valor de um valor OBJECT existente com pares chave-valor adicionais ou novos valores para chaves, chame a função OBJECT_INSERT.

Ao chamar esta função, observe o seguinte:

  • Para os argumentos que são chaves, você deve especificar constantes.

  • Quando o argumento updateFlag é FALSE (quando você está inserindo um novo par chave-valor):

    • Se você especificar uma chave que já exista no valor OBJECT, ocorrerá um erro.

      SELECT OBJECT_INSERT(
        {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
        'city',
        'San Jose',
        false
      );
      
      Copy
      093202 (23001): Function OBJECT_INSERT:
        expected structured object to not contain field city but it did.
      
    • A função retorna um valor OBJECT estruturado. O tipo do valor OBJECT inclui a chave recém-inserida. Por exemplo, suponha que você adicione a chave zipcode com o valor FLOAT 94402:

      SELECT
        OBJECT_INSERT(
          {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
          'zip_code',
          94402::FLOAT,
          false
        ) AS new_object,
        SYSTEM$TYPEOF(new_object) AS type;
      
      Copy
      +-------------------------------------+---------------------------------------------------------------------------------------+
      | NEW_OBJECT                          | TYPE                                                                                  |
      |-------------------------------------+---------------------------------------------------------------------------------------|
      | {                                   | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216), zip_code FLOAT NOT NULL)[LOB] |
      |   "city": "San Mateo",              |                                                                                       |
      |   "state": "CA",                    |                                                                                       |
      |   "zip_code": 9.440200000000000e+04 |                                                                                       |
      | }                                   |                                                                                       |
      +-------------------------------------+---------------------------------------------------------------------------------------+
      

      O tipo do valor inserido determina o tipo adicionado à definição de tipo OBJECT. Nesse caso, o valor de zipcode é um valor convertido em FLOAT, portanto, o tipo de zipcode é FLOAT.

  • Quando o argumento updateFlag é TRUE (quando você está substituindo um par chave-valor existente):

    • Se você especificar uma chave que não existe no valor OBJECT, ocorrerá um erro.

    • A função retorna um valor OBJECT estruturado do mesmo tipo.

    • O tipo do valor inserido é imposto ao tipo da chave existente.

Seleção de pares chave-valor de um OBJECT existente

Para retornar um novo valor OBJECT que contenha pares chave-valor selecionados de um valor OBJECT existente, chame a função OBJECT_PICK.

Ao chamar esta função, observe o seguinte:

  • Para os argumentos que são chaves, você deve especificar constantes.

  • Você não pode passar um ARRAY de chaves como o segundo argumento. Você deve especificar cada chave como um argumento separado.

  • A função retorna um valor OBJECT estruturado. O tipo do valor OBJECT inclui as chaves na ordem em que são especificadas.

    Por exemplo, suponha que você selecione as chaves state e city nesta ordem:

    SELECT
      OBJECT_PICK(
        {'city':'San Mateo','state':'CA','zip_code':94402}::OBJECT(city VARCHAR,state VARCHAR,zip_code DOUBLE),
        'state',
        'city') AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy

    A função retorna um valor OBJECT do tipo OBJECT(state VARCHAR, city VARCHAR).

    +-----------------------+--------------------------------------------------------------+
    | NEW_OBJECT            | SYSTEM$TYPEOF(NEW_OBJECT)                                    |
    |-----------------------+--------------------------------------------------------------|
    | {                     | OBJECT(state VARCHAR(16777216), city VARCHAR(16777216))[LOB] |
    |   "state": "CA",      |                                                              |
    |   "city": "San Mateo" |                                                              |
    | }                     |                                                              |
    +-----------------------+--------------------------------------------------------------+
    

Transformação dos valores MAP

Para transformar os valores MAP, use as seguintes funções:

Como trabalhar com tipos estruturados

As seções a seguir explicam como usar diferentes funções SQL e definir operadores com valores de tipos estruturados:

Uso da função FLATTEN com valores de tipos estruturados

É possível passar valores ARRAY, OBJECT e MAP estruturados para a função FLATTEN. Como é o caso dos tipos de dados semiestruturados, você pode usar o argumento PATH para especificar o valor que está sendo nivelado.

  • Se o valor que estiver sendo nivelado for um valor estruturado ARRAY e o argumento RECURSIVE for FALSE, a coluna value conterá um valor do mesmo tipo que o valor ARRAY.

    Por exemplo:

    SELECT value, SYSTEM$TYPEOF(value)
      FROM TABLE(FLATTEN(INPUT => [1.08, 2.13, 3.14]::ARRAY(DOUBLE)));
    
    Copy
    +-------+----------------------+
    | VALUE | SYSTEM$TYPEOF(VALUE) |
    |-------+----------------------|
    |  1.08 | FLOAT[DOUBLE]        |
    |  2.13 | FLOAT[DOUBLE]        |
    |  3.14 | FLOAT[DOUBLE]        |
    +-------+----------------------+
    
  • Se o valor que estiver sendo nivelado for um valor MAP e o argumento RECURSIVE for FALSE, a coluna key conterá uma chave do mesmo tipo que a chave MAP e a coluna value conterá um valor do mesmo tipo que o valor MAP.

    Por exemplo:

    SELECT key, SYSTEM$TYPEOF(key), value, SYSTEM$TYPEOF(value)
      FROM TABLE(FLATTEN(INPUT => {'my_key': 'my_value'}::MAP(VARCHAR, VARCHAR)));
    
    Copy
    +--------+------------------------+----------+------------------------+
    | KEY    | SYSTEM$TYPEOF(KEY)     | VALUE    | SYSTEM$TYPEOF(VALUE)   |
    |--------+------------------------+----------+------------------------|
    | my_key | VARCHAR(16777216)[LOB] | my_value | VARCHAR(16777216)[LOB] |
    +--------+------------------------+----------+------------------------+
    
  • Caso contrário, as colunas key e value terão o tipo VARIANT.

Para os valores de MAP, a ordem das chaves e dos valores retornados é indeterminada.

Uso da função PARSE_JSON

A função PARSE_JSON não retorna tipos estruturados.

Como usar tipos estruturados com operadores de conjunto e expressões CASE

É possível usar os valores estruturados ARRAY, OBJECT e MAP em:

Para operadores de conjunto, se tipos diferentes forem usados em expressões diferentes (por exemplo, se um tipo for ARRAY(NUMBER) e o outro for ARRAY(DOUBLE)), um tipo será convertido para o outro.

Como trabalhar com outras funções semiestruturadas

As seguintes funções não aceitam valores ARRAY estruturados, OBJECT estruturados ou MAP como argumento de entrada:

A passagem de um valor de tipo estruturado como entrada resulta em um erro.

Acesso a tipos estruturados em aplicativos usando drivers

Em aplicativos que usam drivers (por exemplo, o driver ODBC ou JDBC, o Snowflake Connector para Python etc.), os valores de tipos estruturados são retornados como valores de tipos semiestruturados. Por exemplo:

  • Os valores em uma coluna ARRAY estruturada são retornados como valores ARRAY semiestruturados para o aplicativo cliente.

  • Os valores em uma coluna estruturada OBJECT ou MAP são retornados como valores OBJECT semiestruturados para o aplicativo cliente.

Nota

Para aplicativos clientes que usam o driver JDBC, o método ResultSet.getArray() retorna um erro se os resultados de consulta que você deseja recuperar contiverem um valor ARRAY estruturado com valores NULL.

Para recuperar uma representação de cadeia de caracteres, use o método ResultSet.getString():

String result = resultSet.getString(1);
Copy

Como usar tipos estruturados com funções definidas pelo usuário (UDFs) e procedimentos armazenados

Ao criar uma função definida pelo usuário (UDF), uma função de tabela definida pelo usuário (UDTF) ou um procedimento armazenado em SQL, Script Snowflake, Java, Python, ou Scala, você pode usar tipos estruturados nos argumentos e valores de retorno. Por exemplo:

CREATE OR REPLACE FUNCTION my_udf(
    location OBJECT(city VARCHAR, zipcode NUMBER, val ARRAY(BOOLEAN)))
  RETURNS VARCHAR
  AS
  $$
    ...
  $$;
Copy
CREATE OR REPLACE FUNCTION my_udtf(check BOOLEAN)
  RETURNS TABLE(col1 ARRAY(VARCHAR))
  AS
  $$
  ...
  $$;
Copy
CREATE OR REPLACE PROCEDURE my_procedure(values ARRAY(INTEGER))
  RETURNS ARRAY(INTEGER)
  LANGUAGE SQL
  AS
  $$
    ...
  $$;
Copy
CREATE OR REPLACE FUNCTION my_function(values ARRAY(INTEGER))
  RETURNS ARRAY(INTEGER)
  LANGUAGE PYTHON
  RUNTIME_VERSION=3.10
  AS
  $$
    ...
  $$;
Copy

Nota

Os tipos estruturados ainda não são compatíveis em UDFs, UDTFs e os procedimentos armazenados em JavaScript.

Exibição de informações sobre tipos estruturados

As seções a seguir descrevem as exibições e os comandos que podem ser usados para visualizar informações sobre tipos estruturados:

Como usar o comando SHOW COLUMNS para visualizar informações de tipo estruturado

Na saída do comando SHOW COLUMNS, a coluna data_type inclui informações sobre os tipos de elementos, chaves e valores.

Como usar os comandos DESCRIBE e outros SHOW para visualizar informações de tipo estruturado

A saída dos comandos a seguir inclui informações sobre tipos estruturados:

Por exemplo, na saída DESCRIBE RESULT, a linha de uma coluna MAP(VARCHAR, VARCHAR) contém o seguinte valor na coluna type:

map(VARCHAR(16777216), VARCHAR(16777216))
Copy

A linha de uma coluna ARRAY(NUMBER) contém o seguinte valor na coluna type:

ARRAY(NUMBER(38,0))
Copy

Exibição de informações sobre os tipos estruturados usados em um banco de dados

Para colunas de tipos estruturados, INFORMATION_SCHEMA Exibição COLUMNS fornece apenas informações sobre o tipo de dados básico da coluna (ARRAY, OBJECT ou MAP).

Por exemplo, a coluna data_type contém apenas ARRAY, OBJECT ou MAP. A coluna não inclui os tipos de elementos, chaves ou valores.

Para visualizar informações sobre os tipos de elementos, chaves e valores, use as seguintes exibições: