O tipo de dados STRUCT permite agrupar campos de diferentes tipos em um único valor. Este tópico aborda os três métodos de construção e o acesso aos campos após a criação da estrutura.
Escolha um método de construção
O MaxCompute oferece três formas de construir um STRUCT. Cada uma difere na atribuição dos nomes dos campos:
|
Método |
Definição dos nomes de campo |
Suporte a NULL |
|
Definido por você (opcional |
Compatível quando o modo de compatibilidade com BigQuery está ativado |
|
|
Sempre gerado automaticamente como |
Incompatível |
|
|
Definido por você como constantes de string |
Incompatível |
Quando usar cada método:
Use a STRUCT EXPRESSION quando precisar de campos nomeados, quiser construir um STRUCT a partir de todas as colunas da tabela (
STRUCT(*)) ou necessitar de valores de campo NULL.Use a função STRUCT quando os nomes dos campos não forem relevantes e todos os valores forem não NULL.
Use a função NAMED_STRUCT quando os nomes dos campos precisarem ser constantes de string explícitas e todos os valores forem não NULL.
Observações de uso
Todos os três métodos aceitam aninhamento. Um campo STRUCT pode ser, ele próprio, um ARRAY ou MAP.
-
Por padrão, os campos STRUCT não aceitam valores NULL. Para usar NULL como valor de campo, ative o modo de compatibilidade com BigQuery e utilize o método STRUCT EXPRESSION:
SET odps.sql.bigquery.compatible=true;Essa configuração aplica-se apenas ao método STRUCT EXPRESSION. A função STRUCT e a função NAMED_STRUCT não aceitam valores NULL, independentemente dessa configuração.
STRUCT EXPRESSION
A STRUCT EXPRESSION constrói um STRUCT a partir de uma lista de expressões. Os nomes dos campos são opcionais; atribua-os com AS field_name.
Uma capacidade exclusiva da STRUCT EXPRESSION é aceitar STRUCT(*) para encapsular todas as colunas de uma tabela em um único valor STRUCT.
Sintaxe
STRUCT(expression1 [[AS] field_name1], expression2 [[AS] field_name2], ...)
Parâmetros:
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Qualquer expressão válida: referência de coluna, constante ou expressão computada. |
|
|
Não |
Palavra-chave prefixada antes de um nome de campo opcional. |
|
|
Não |
Nome do campo no STRUCT resultante. Os nomes dos campos não diferenciam maiúsculas de minúsculas e devem ser únicos dentro da mesma expressão. |
Valor retornado: STRUCT<field_name1:T1, field_name2:T2, ...>
Exemplos
Construir um STRUCT com campos nomeados:
SELECT * FROM VALUES (STRUCT(1 AS a, 2 AS b, 3 AS c, 4 AS d)) AS tbl1(struct1);
-- Result
{a:1, b:2, c:3, d:4}
Acessar um campo específico:
SELECT struct1.b FROM VALUES (STRUCT(1 AS a, 2 AS b, 3 AS c, 4 AS d)) AS tbl1(struct1);
-- Result
+------------+
| b |
+------------+
| 2 |
+------------+
Construir um STRUCT com valores de campo NULL (requer modo de compatibilidade com BigQuery):
SET odps.sql.bigquery.compatible=true;
SELECT STRUCT(NULL AS Col_1, 2 AS Col_2);
-- Result
{col_1:NULL, col_2:2}
Função STRUCT
A função STRUCT constrói um STRUCT a partir de uma lista de valores. O MaxCompute gera automaticamente os nomes dos campos como col1, col2 e assim por diante. Não é possível atribuir nomes personalizados com este método. Valores NULL não são aceitos.
Sintaxe
STRUCT(value1, value2, ...)
Parâmetros: Cada valor pode ser de qualquer tipo, exceto NULL.
Valor retornado: STRUCT<col1:T1, col2:T2, ...> — os nomes dos campos são sempre col1, col2 e assim por diante.
Exemplos
SELECT STRUCT('a', 123, 'true', 56.90);
-- Result
{col1:a, col2:123, col3:true, col4:56.9}
Função NAMED_STRUCT
A função NAMED_STRUCT constrói um STRUCT a partir de pares alternados de nome e valor. Todos os nomes de campo devem ser constantes de string. Valores NULL não são aceitos.
Sintaxe
NAMED_STRUCT(string_name1, value1, string_name2, value2, ...)
Parâmetros:
|
Parâmetro |
Descrição |
|
|
Constante de string que especifica o nome do campo. Os nomes dos campos não diferenciam maiúsculas de minúsculas. |
|
|
Valor do campo. Qualquer tipo é aceito, exceto NULL. |
Valor retornado: STRUCT<string_name1:T1, string_name2:T2, ...>
Exemplos
SELECT NAMED_STRUCT('user_id', 10001, 'user_name', 'LiLei', 'married', 'F', 'weight', 63.50);
-- Result
{user_id:10001, user_name:LiLei, married:F, weight:63.5}
Acessar campos
Para acessar um campo STRUCT, adicione .field_name ao valor STRUCT ou à referência da coluna.
struct_value.field_name
Exemplo:
SELECT struct1.b
FROM VALUES (STRUCT(1 AS a, 2 AS b, 3 AS c)) AS tbl1(struct1);
-- Result
2
Os nomes dos campos nas expressões de acesso não diferenciam maiúsculas de minúsculas.