【问题标题】:How do I split a row into multiple columns in Presto?如何在 Presto 中将一行拆分为多列?
【发布时间】:2021-11-04 12:08:48
【问题描述】:

我有一个如下表,其中包含 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 会创建新的 rows(我不想要)并且 split_part 不适用于 ROW 类型。我怎样才能做到这一点?

【问题讨论】:

  • TBH 它在我看来更像是数组,而不是行。
  • presto中有数组类型和行类型,本题是针对ROW的

标签: sql presto trino


【解决方案1】:

假设B 列是ROW 类型,则可以在SELECT statements 中使用.* ROW 运算符。

这种语法在 Trino (formerly 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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多