Как разделить строку на несколько столбцов в Presto?

#sql #presto #trino

Вопрос:

У меня есть таблица, как показано ниже, со столбцами A (строка) и СТРОКОЙ B(int):

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

И я хотел бы разделить второй столбец (который содержит тип СТРОКИ) на несколько столбцов таким образом:

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

Я считаю, что это можно сделать с помощью инструкции SQL, но unnest создаст новые строки (чего я не хочу) и split_part не работает с ROW типом. Как я могу этого достичь?

Комментарии:

1. TBH для меня это больше похоже на массив, а не на строку.

2. В presto существуют типы массивов и типы строк, этот вопрос относится к строке

Ответ №1:

Предполагая, что столбец B является ROW типом, вы можете использовать .* ROW оператор в операторах SELECT.

Этот синтаксис существует в Trino (ранее PrestoSQL), но не в PrestoDB, поэтому он зависит от того, какую версию вы используете для этой работы. Я бы все равно рекомендовал переехать в Трино, если вы еще этого не сделали.

Копирование/Вставка:

 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;