如何在 Presto 中将一行拆分为多列?

How do I split a row into multiple columns in Presto?

我有一个如下所示的 table 列 A(字符串)和 B ROW(int):

A   B
a   [1,2,3]
b   [0,0,5]
c   [3,1,4]

我想将第二列(其中包含一个 ROW 类型)拆分成多个列:

A   B1 B2 B3
a   1  2  3
b   0  0  5
c   3  1  4

我相信这可以通过 SQL 语句来完成,但是 unnest 会创建新的 (我不想要)和 split_part不适用于 ROW 类型。我怎样才能做到这一点?

假设列 BROW 类型,您可以在 SELECT statements.

中使用 .* ROW 运算符

此语法存在于 Trino (formerly PrestoSQL) 中,但不存在于 PrestoDB 中,因此这取决于您使用的版本。如果您还没有,我建议您无论如何都搬到 Trino。

Copy/Paste:

WITH t(a, b) AS (
  VALUES
    ('a', ROW(1,2,3)),
    ('b', ROW(0,0,5)),
    ('c', ROW(3,1,4))
  )
SELECT 
  a as A,
  t.b.* AS (B1, B2, B3)
FROM t;

执行:

trino> WITH t(a, b) AS (
    ->   VALUES
    ->     ('a', ROW(1,2,3)),
    ->     ('b', ROW(0,0,5)),
    ->     ('c', ROW(3,1,4))
    ->   )
    -> SELECT
    ->   a as A,
    ->   t.b.* AS (B1, B2, B3)
    -> FROM t;
 A | B1 | B2 | B3
---+----+----+----
 a |  1 |  2 |  3
 b |  0 |  0 |  5
 c |  3 |  1 |  4
(3 rows)

这是对所选解决方案的等效答案,语法略有不同:

SELECT
A,
B[1] AS B1,
B[2] AS B2,
B[3] AS B3
FROM table;