Афина — извлечение подстроки из строки, разделенной запятыми

#amazon-web-services #amazon-athena #presto #trino

Вопрос:

Я хочу создать представление Афины из таблицы Афины.

В таблице значение столбца «фамилия, имя», поэтому я хочу извлечь эти значения как «фамилия» и «имя», а затем сохранить их в отдельных столбцах в представлении. пример — имя должно быть сохранено в новом столбце — » имя » и фамилия должны быть сохранены в новом столбце — «имя»

какова функция SQL, которую я могу здесь использовать? Я попробовал разделить функцию, но затем она выдает мне массив.

Ответ №1:

Предполагая, что входные строки содержат фиксированное и известное количество элементов, вы можете сделать что-то вроде этого:

 WITH data(value) AS (
    VALUES ('Aaa,Bbb')
)
SELECT elements[1], elements[2]
FROM (
    SELECT split(value, ',') AS elements
    FROM data
)
 

=>

  _col0 | _col1
------- -------
 Aaa   | Bbb
(1 row)
 

Ответ №2:

Вы можете использовать UNNEST результат разделения:

 WITH dataset AS (
    SELECT * FROM (VALUES   
       ('aaa,bbb'),
       ('aaa1,bbb1')
 ) AS t (str))


SELECT str_col
FROM dataset
CROSS JOIN UNNEST(split(str, ',')) as tmp(str_col)
 

Выход:

str_col
ааа
bbb
ааа1
bbb1

UPD

Если у вас есть хотя бы одна гарантированная запятая, то это так же просто, как:

 
WITH dataset AS (
    SELECT * FROM (VALUES   
       ('aaa,bbb'),
       ('aaa1,bbb1')
 ) AS t (str))

SELECT splt[1] last_name, splt[2] first_name
FROM
(SELECT split(str, ',') as splt
FROM dataset)
 

Выход:

фамилия имя пользователя
ааа bbb
ааа1 bbb1

В случае, если у вас может быть различное количество запятых, но оно ограничено некоторым числом, которое вы можете использовать TRY :

 WITH dataset AS (
    SELECT * FROM (VALUES   
       ('aaa,bbb'),
       ('aaa1,bbb1,ddd1')
 ) AS t (str))

SELECT splt[1], splt[2], TRY(splt[3])
FROM
(SELECT split(str, ',') as splt
FROM dataset)
 

Выход:

_col0 _кол1 _col2
ааа bbb
ааа1 bbb1 ddd1

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

1. Здравствуйте, спасибо за ваш ответ.. На самом деле мне нужно хранить его не в отдельной строке, а в отдельных столбцах.. Например, столбец 1 должен иметь Aaa, а столбец 2 должен иметь Bbb.

2. @Beginner имеет ли строка известное количество элементов, в основном ли максимальное количество запятых известно заранее?

3. Да, в каждом значении есть только одна запятая. это как фамилия, имя. поэтому мне нужно извлечь фамилию и сохранить ее в новом столбце last_name, а имя должно быть сохранено в новом столбце first_name