Как можно конвертировать данные из формата JSONB в PostgreSQL в таблицу с определенными столбцами?

Как можно создать новую таблицу из передаваемого JSON, так чтобы она содержала поле "id-question", соответствующее значению "идентификатора_вопроса_с_указанием"?
  • 22 февраля 2024 г. 21:28
Ответы на вопрос 2
Для конвертации данных из формата JSONB в PostgreSQL в таблицу с определенными столбцами можно использовать функцию `jsonb_populate_record` в сочетании с оператором `SELECT INTO`.

Например, если у вас есть JSONB данные вида:
```json
{
  "id": 1,
  "question": "How are you?",
  "answer": "I am fine."
}
```

И вы хотите конвертировать их в таблицу с столбцами "id", "question" и "answer", то вы можете сделать это следующим образом:

```sql
CREATE TABLE questions (
  id INT,
  question TEXT,
  answer TEXT
);

INSERT INTO questions
SELECT * FROM JSONB_POPULATE_RECORDSET(NULL::questions, '[{"id": 1, "question": "How are you?", "answer": "I am fine."}]');
```

Чтобы создать новую таблицу из передаваемого JSON с полем "id-question", соответствующим значению "идентификатора_вопроса_с_указанием", можно сделать следующим образом:

```sql
CREATE TABLE question_table AS
SELECT data->>'id' || '-' || data->>'question' AS "id-question"
FROM jsonb_array_elements('[{"id": 1, "question": "How are you?"}, {"id": 2, "question": "What is your name?"}]') AS data;
```

Этот запрос создаст новую таблицу "question_table" с одним столбцом "id-question", который будет содержать значения в формате "идентификатор_вопроса - текст_вопроса".
Как сделать так, чтобы из сохраняемого JSON создать новую таблицу

Такой скрипт не должен создавать новые структуры в СУБД, он должен делать только вставки записей (insert-ы) в заранее подготовленные таблицы на этапе проектирования базы данных.

id-question: "идентификатор_вопроса_с_указанием_типа"
answer: "value":<ответ_на_вопрос>
date: "created":"<дата_ответа>"

Вот и создайте эту структуру ручками, create table вам в помощь.
и далее объединить с таблицей, где будут поля

Опять же при вставке данных в базе не должно происходить модификации самой структуры базы.
Вы при выборке данных сопоставляете данные из одной таблицы с другой таблицы при помощи внешних ключей.
Запрос выборки будет иметь конструкцию join:
select *
 from  Answer A
  join Question Q on Q.id_question = A.id_question -- как раз соединение по ключам
  ...

В общем, учите мат. часть по реляционным СУБД.
Похожие вопросы