Ссылка на поле объекта строки
У меня проблемы с доступом к полям объектов строк, которые я создал в Presto. В документации Presto утверждается, что "поля... доступны с помощью оператора ссылки на поле". Однако это не похоже на работу. Этот код воспроизводит проблему:
CREATE TABLE IF NOT EXISTS data AS
SELECT * FROM (VALUES
(1, 'Adam', 17),
(2, 'Bill', 42)
) AS x (id, name, age);
CREATE TABLE IF NOT EXISTS ungrouped_data AS
WITH grouped_data AS (
SELECT
id,
ROW(name, age) AS name_age
FROM data
)
SELECT
id,
name_age.1 AS name,
name_age.2 AS age
FROM grouped_data;
Что возвращает ошибку "посторонний ввод '.1'".
1 ответ
Решение
ROW(name, age)
создаст строку без имен полей. Сегодня, чтобы получить доступ к полям в такой строке, вам нужно привести ее в строку с именами полей. Попробуй это:
WITH grouped_data AS (
SELECT
id,
CAST(ROW(name, age) AS ROW(col1 VARCHAR, col2 INTEGER)) AS name_age
FROM data
)
SELECT
id,
name_age.col1 AS name,
name_age.col2 AS age
FROM grouped_data;
Результат:
id | name | age
----+------+-----
1 | Adam | 17
2 | Bill | 42
См. https://github.com/prestodb/presto/issues/7640 для обсуждения этого вопроса.
Начиная с Presto 314, теперь можно ссылаться на ROW
поля с использованием []
оператор.
WITH grouped_data AS (
SELECT
id,
ROW(name, age) AS name_age
FROM data
)
SELECT
id,
name_age[1] AS name,
name_age[2] AS age
FROM grouped_data;