Postgres текст в массив текста при использовании вставки - PullRequest
0 голосов
/ 10 июля 2020

У меня есть файл csv, в котором указаны авторы столбцов:

test.csv

authors 
authorA, authorB

Здесь авторы - это имя столбца, а значения - authorA , authorB.

Я импортировал данные в таблицу test_author, которая имеет структуру:

CREATE TABLE IF NOT EXISTS test_author(authors text);

Теперь я хочу перенести данные из этой таблицы в другую таблицу final с помощью скрипта а база данных - postgres.

CREATE TABLE IF NOT EXISTS final(authors text[]);

Здесь авторы - это массив.

сценарий:

for file in test.csv
do
    tail -n +2 $file > tempLoc
    PGPASSWORD=postgres psql -h postgres -U postgres postgres  \
      -c "\copy  test_author FROM 'tempLoc' delimiter ',' csv;"
done

Когда я выполняю сценарий, я получаю сообщение об ошибке.

Он передает данные в test_author, и я выполняю:

transfer. sql

INSERT INTO  final (authors)
SELECT
  authors
from final

Ошибка:

ERROR:  column "authors" is of type text[] but expression is of type text
LINE 12:     authors,
             ^
HINT:  You will need to rewrite or cast the expression.

Итак, у меня есть данные в файле csv, мне нужно передать эти данные в временную таблицу, которая имеет поле типа текста, используя скрипт и, наконец, в окончательную таблицу который имеет поле типа массив. И я столкнулся с ошибкой, как я могу ее решить? Я бы предпочел внести изменения в передачу файлов. sql предпочтительно.

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Я предполагаю, что вы хотите преобразовать строку, разделенную запятыми, в массив при копировании данных, вы можете сделать это, используя string_to_array()

INSERT INTO  final (authors)
SELECT string_to_array(authors, ',')
from test_author;

Это, однако, сохранит пробел после , в authorA, authorB. Вы можете избежать этого, используя regexp_split_to_array()

INSERT INTO  final (authors)
SELECT regexp_split_to_array(authors, '\s*,\s*')
from test_author;
0 голосов
/ 10 июля 2020

Попробуйте использовать:

INSERT INTO  final (authors)
SELECT
  authors:: text[]
from final;
...