struct
使用 struct 数据类型可创建包含嵌套列的列。嵌套列可以是各种数据类型,包括 struct 类型。
定义 struct 类型
句法:
STRUCT< >
struct 类型使用尖括号(<
和 >
)声明。
示例
下面的语句可创建一个包含 struct a
的表 x
,该 struct 包含两个嵌套列(b
和 c
),它们都是整数。
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