Skip to main content

struct

使用 struct 数据类型可创建包含嵌套列的列。嵌套列可以是各种数据类型,包括 struct 类型。

定义 struct 类型

句法: STRUCT< >

struct 类型使用尖括号(<>)声明。

示例

下面的语句可创建一个包含 struct a 的表 x,该 struct 包含两个嵌套列(bc),它们都是整数。

CREATE TABLE x (a STRUCT <b INTEGER, c INTEGER>, d INTEGER);

下面的语句可创建一个包含 struct a 的表 y,该 struct 又包含另一个 struct c

CREATE TABLE y (a STRUCT <b STRUCT<c INTEGER>, d INTEGER>, e VARCHAR);

以下是一个实际示例。

CREATE TABLE trip (
id VARCHAR,
started_at TIMESTAMP,
completed_at TIMESTAMP,
distance DOUBLE PRECISION,
fare STRUCT <
initial_charge DOUBLE PRECISION,
subsequent_charge DOUBLE PRECISION,
surcharge DOUBLE PRECISION,
tolls DOUBLE PRECISION
>
);

还可以使用 struct 类型将包含 JSON 格式数据的字符串解析为适当的格式。

例如,如果数据结构如下:

{
"nested": "{\"v1\": 10, \"v2\": \"hello\"}"
}

而你希望其结构是这样的:

{
"nested": {
"v1": 10,
"v2": "hello"
}
}

可以使用 struct 类型进行解析。

CREATE SOURCE z (nested STRUCT <v1 INTEGER, v2 VARCHAR>) FORMAT JSON;

向 struct 添加值

要向 struct 中添加值,可在 SQL 语句中用 () 括住嵌套数据。例如,(1, true)。或者,也可以使用 ROW(1,true)

示例

下面的语句可向表 x 添加值。

INSERT INTO x VALUES (ROW(3, 4), 5);

下面的语句可向表 y 添加值。

INSERT INTO y VALUES (ROW(ROW(6), 7), 8);

下面的语句可向表 trip 添加值。

INSERT INTO trip VALUES 
(
'1234ABCD',
'2022-07-28 11:04:05',
'2022-07-28 11:15:22',
6.1,
ROW(1.0, 4.0, 1.5, 2.0)
);

从 struct 检索数据

要检索 struct 中的数据,可用 () 括住 struct 名称,并使用点操作符指定嵌套列。例如,要访问 trip schema 中 fare 下的 initial_charge 列,可使用 (fare).initial_charge

示例

SELECT (a).b, d
FROM x;
SELECT ((a).b).c, e
FROM y;
SELECT id, (fare).initial_charge 
FROM trip;

转换

如果嵌套的表达式和类型是可以转换的,那么 struct 之间就可以进行显式或隐式转换。

示例

SELECT (1, (2, 3))::STRUCT<i BIGINT, j STRUCT<a BIGINT, b VARCHAR>>;
-----返回结果
(1,(2,3))
SELECT ROW(1, ROW('1', 1)) = ROW('1', ROW(1, '1'));
-----
t