#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;