Ссылка на поле объекта строки

У меня проблемы с доступом к полям объектов строк, которые я создал в 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;
Другие вопросы по тегам