首页 > 解决方案 > 如何在 Presto 中将一行拆分为多列?

问题描述

我有一个如下表,其中包含 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类型。我怎样才能做到这一点?

标签: sqlprestotrino

解决方案


假设 columnB是一种ROW类型,您可以在SELECT statements.* ROW中使用operator 。

这种语法存在于 Trino(以前称为 PrestoSQL)中,但不存在于 PrestoDB 中,因此它取决于您使用的版本来使其工作。如果你还没有的话,我建议你还是搬到 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;

执行:

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)

推荐阅读