STRUCT数据类型

MaxCompute支持STRUCT(结构体)数据类型,可以将不同类型的字段组合成一个逻辑单元。本文为您介绍STRUCT数据类型的使用方法。

构造方式

构造方式介绍及区别

MaxCompute支持STRUCT EXPRESSION、STRUCT函数和NAMED_STRUCT函数三种不同的构造STRUCT数据类型的方式。

构造方式

构造示例

数据类型

STRUCT EXPRESSION

支持使用value列表和Named Expression(命名表达式)列表。

STRUCT(1L AS a,'abc' AS b,null as c)

STRUCT<a:bigint,b:string,c:string>

STRUCT(str_col AS abc) from t

STRUCT<abc:string>

STRUCT(*) from t

支持使用*将表的所有列构造成一个STRUCT。

STRUCT<str_col:string,...>

STRUCT函数

支持使用value列表。

STRUCT(1L,2L,3L)

STRUCT<col1:bigint,col2:bigint,col3:bigint>

STRUCT('abc')

STRUCT<col1:string>

STRUCT(1L,t.str_col) from t

STRUCT<col1:int,col2:string>

NAMED_STRUCT函数

支持使用name/value列表。

NAMED_STRUCT('a',1L,'b','b_','c',3.50)

STRUCT<a:bigint,b:string,c:double>

NAMED_STRUCT('a', str_col...) from t

STRUCT<a:string,...>

STRUCT EXPRESSIONSTRUCT函数的区别是:STRUCT函数不支持对每个参数指定别名名称,系统在构造STRUCT时会自动按照参数顺序补充field的名称依次为col1,col2,...。

注意事项

  • 不同的构造语法支持嵌套使用,也支持跟其他复杂类型ARRAY、MAP的构造函数嵌套组合使用。

  • STRUCT数据类型默认不支持NULL作为字段值。如果需要使用NULL值,需要打开Bigquery兼容模式开关SET odps.sql.bigquery.compatible=true;,同时仅支持使用STRUCT EXPRESSION方式进行构造。

STRUCT EXPRESSION

STRUCT EXPRESSION(STRUCT表达式)提供了构造复杂类型STRUCT的一种方法,支持在构造STRUCT的时候使用value列表和Named Expression(命名表达式)列表。

构造语法

STRUCT(expression1 [[AS] field_name1], expression2 [[AS] field_name2], ...)
  • 参数说明:

    参数

    是否必填

    说明

    expression

    可以是任意表达式和数据类型,可以使用列名、常数及表达式等。

    as

    STRUCT表达式中字段名称的前置关键字。

    field_name

    生成的STRUCT中对应的字段名称,字段名大小写不敏感。同一个STRUCT表达式内部多个输入表达式的字段名不能重复。

  • 返回值:返回STURCT类型,STRUCT <field_name1:T1, field_name2:T2, ...>,其field的名称依次为field_name1, field_name2, ...。

使用示例

  • 使用非NULL值作为字段值。

    SELECT * FROM VALUES (STRUCT (1 AS a, 2 AS b, 3 AS c, 4 AS d)) AS tbl1(struct1);
    
    -- 返回结果
    {a:1, b:2, c:3, d:4}
    
    SELECT struct1.b FROM VALUES (STRUCT (1 AS a, 2 AS b, 3 AS c, 4 AS d)) AS tbl1(struct1);
    
    -- 返回结果
    +------------+
    | b          |
    +------------+
    | 2          |
    +------------+
  • 使用NULL值作为字段值。您需要执行命令SET odps.sql.bigquery.compatible=true;开启Bigquery兼容模式。

    SET odps.sql.bigquery.compatible=true;
    SELECT STRUCT (NULL AS Col_1, 2 AS Col_2);
    
    -- 返回结果
     {col_1:NULL, col_2:2} 

STRUCT函数

MaxCompute支持使用STRUCT函数对给定的value列表建立STRUCT数据类型。

构造语法

STRUCT STRUCT(value1,value2, ...)
  • 参数说明:value可以为任意类型,不支持NULL。

  • 返回值:返回STRUCT类型,STRUCT<col1:T1, col2:T2,...>类型,filed的名称依次为col1,col2,...。

使用示例

SELECT STRUCT('a',123,'true',56.90);

-- 返回结果
{col1:a, col2:123, col3:true, col4:56.9}

NAMED_STRUCT函数

MaxCompute支持使用NAMED_STRUCT函数对给定的name/value列表构建STRUCT数据类型。

构造语法

STRUCT NAMED_STRUCT(string_name1, T1 value1, string_name2, T2 value2,...)
  • 参数说明:

    • string_name:指定的string类型的field名称,必须为常量,字段名大小写不敏感。

    • value:可以为任意类型,不支持NULL。

  • 返回值:返回STURCT类型,STRUCT<string_name1:T1, string_name2:T2, ...>类型, 其中field的名称依次为string_name1, string_name2, ...。

使用示例

SELECT NAMED_STRUCT('user_id',10001,'user_name','LiLei','married','F','weight',63.50);

-- 返回结果
{user_id:10001, user_name:LiLei, married:F, weight:63.5}