Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 12.12.2016
Сообщений: 15
1

Insert многомерного массива

24.04.2017, 22:03. Показов 2542. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Товарищи, подскажите, есть ли какая либо возможность инсерта в таблицу такого массива:
[ { idReq: 1, idUser: [ 173, 154, 163, 179 ] },
{ idReq: 2, idUser: [ 191, 154 ] },
{ idReq: 3, idUser: [] },
{ idReq: 5, idUser: [] },
{ idReq: 6, idUser: [] } ]
Есть таблица связей. В ней колонка id, колонка idReq - int, и колонка idUser - int[].
По одной записи проблем с инсертом нет, через unnest массива юзеров, но как быть в этой ситуации? Цикл?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2017, 22:03
Ответы с готовыми решениями:

Insert многомерного массива в базу MYSQL
Здравствуйте, подскажите пожалуйста есть такой вопрос. Имеется многомерный массив такого типа: -...

Как сделать Insert многомерного массива в бд
Например есть массив: $output=array("a"=>1,"b"=>2,"c"=>3); Здесь можно в цикле делать...

Внутреннее устройство многомерного массива и неявное преобразование массива в указатель
Букв получилось многовато. Поэтому, чтобы сэкономить Ваше время, предлагаю сразу вопрос: Буду...

Cоздание многомерного массива - из 3х3 массива сделать 4х3
Создать многомерный массив 4x3 элементов. По данному примеру. Пример. Код C#include <stdio.h> ...

6
1254 / 970 / 382
Регистрация: 02.09.2012
Сообщений: 2,995
24.04.2017, 23:59 2
Приведите пример кода, где вы это используете. Непонятно, что конкретно вы хотите.
0
0 / 0 / 0
Регистрация: 12.12.2016
Сообщений: 15
25.04.2017, 09:15  [ТС] 3
Цитата Сообщение от grgdvo Посмотреть сообщение
Приведите пример кода, где вы это используете. Непонятно, что конкретно вы хотите.
Ну это будет не совсем пример кода.
Изначально я делал так.
У меня есть 2 переменные:
$1 = [ 173, 154, 163, 179 ] - массив id юзеров
$2 = 1 - id записи, которой принадлежат юзеры
Делаем инсерт
SQL
1
INSERT INTO TABLE (id_user,id_request) VALUES (ARRAY[$1],$2);
получаем в таблице:
id| id_request| id_user
-----+-------------+------------------------------
1 | 1 |{173, 154, 163, 179 }}


Но это одна запись. То есть целый массив у меня приходит так:
[ { idReq: 1, idUser: [ 173, 154, 163, 179 ] },
{ idReq: 2, idUser: [ 191, 154 ] },
{ idReq: 3, idUser: [] },
{ idReq: 5, idUser: [] },
{ idReq: 6, idUser: [] } ]

Вот мне и нужно его сразу целиком записать. что бы было так:
id| id_request| id_user
-----+-------------+------------------------------
1 | 1 |{{173, 154, 163, 179 }}
2 | 2 |{{ 191, 154 }}
3 | 3 |{{}}
4 | 5 |{{}}
5 | 6 |{{}}
0
1254 / 970 / 382
Регистрация: 02.09.2012
Сообщений: 2,995
25.04.2017, 12:53 4
У вас "целый массив" это что?? Тип данных JSON??
Если JSON, то и работать нужно с ним как с JSON. И синтаксис JSON соблюдать.

Для INSERT работает конструкция INSERT... SELECT FROM. Вот примерный набросок
SQL
1
2
3
4
5
6
7
INSERT INTO  test (id_request, id_user) 
SELECT "idReq", "idUser" FROM
json_to_recordset('[ {"idReq": 1, "idUser": [173,154,163,179] },
  {"idReq": 2, "idUser":[191,154]},
  {"idReq": 3, "idUser":[]},
  {"idReq": 5, "idUser":[]},
  {"idReq": 6, "idUser":[]}]'::json) AS j("idReq" INT, "idUser" text);
Этот запрос не отработает хотя бы потому, что я не помню на память как из JSON выдирать массивы, да еще и преобразовывать их к нужному типу элемента. Попробуйте примеры в интернете поискать по образцу, может получится составить один такой запрос на вставку.
0
0 / 0 / 0
Регистрация: 12.12.2016
Сообщений: 15
25.04.2017, 13:02  [ТС] 5
Цитата Сообщение от grgdvo Посмотреть сообщение
У вас "целый массив" это что?? Тип данных JSON??
Если JSON, то и работать нужно с ним как с JSON. И синтаксис JSON соблюдать.

Для INSERT работает конструкция INSERT... SELECT FROM. Вот примерный набросок
SQL
1
2
3
4
5
6
7
INSERT INTO  test (id_request, id_user) 
SELECT "idReq", "idUser" FROM
json_to_recordset('[ {"idReq": 1, "idUser": [173,154,163,179] },
  {"idReq": 2, "idUser":[191,154]},
  {"idReq": 3, "idUser":[]},
  {"idReq": 5, "idUser":[]},
  {"idReq": 6, "idUser":[]}]'::json) AS j("idReq" INT, "idUser" text);
Этот запрос не отработает хотя бы потому, что я не помню на память как из JSON выдирать массивы, да еще и преобразовывать их к нужному типу элемента. Попробуйте примеры в интернете поискать по образцу, может получится составить один такой запрос на вставку.
"Целый" это я для окраски текста Типа там всего лишь переменные, а тут "целый" массивище. Все верно, JSON

Вот, спасибо, я теперь понял примерную конструкцию инсерта подобных массивов, буду копать дальше.
0
1254 / 970 / 382
Регистрация: 02.09.2012
Сообщений: 2,995
25.04.2017, 16:34 6
Получилось вот такое поделие. Одна проблема - пустые JSON-массивы. Они (пустые массивы) проглатываются функцией json_array_elements, которая превращает JSON-массив в записи с элементами массива. А json_array_elements в свою очередь удобна и необходима (вместе с array_agg), чтобы из JSON-массива получить обычный массив целых INT[].
Пришлось обходить проблему пустых массивов через CTE и union all. Кто знает более изящное решение, может поделитесь.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
INSERT INTO  test (id_request, id_user)
WITH src("idReq", "idUser") AS (
SELECT (srcdata->'idReq')::text::INT, srcdata->'idUser' "idUser" FROM 
json_array_elements(
'[{"idReq": 1, "idUser":[173,154,163,179]},
  {"idReq": 2, "idUser":[191,154]},
  {"idReq": 3, "idUser":[]},
  {"idReq": 5, "idUser":[]},
  {"idReq": 6, "idUser":[]}]'::json) srcdata
)
SELECT "idReq", array_agg("idUser") FROM
(SELECT "idReq", json_array_elements("idUser")::text::INT "idUser" FROM src WHERE json_array_length(src."idUser") != 0) q1
GROUP BY 1
UNION ALL
SELECT "idReq", '{}'::INT[] "idUser" FROM src WHERE json_array_length(src."idUser") = 0;
1
0 / 0 / 0
Регистрация: 12.12.2016
Сообщений: 15
25.04.2017, 17:53  [ТС] 7
Цитата Сообщение от grgdvo Посмотреть сообщение
Получилось вот такое поделие.....
Кудесник! Работает, спасибо!
Правда все равно возникает ряд сложностей. Работает без проблем в конструкторе базы.
Но по факту запрос идет из Node.js строкой, там беда с кавычками и я создал функцию в постгресе

SQL
1
CREATE OR REPLACE FUNCTION test_executors(json) RETURNS INTEGER[] AS'
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
BEGIN
INSERT INTO  personal_account.dependence_executor_to_request(id_request, id_user)
WITH src("idReq", "idUser") AS (
SELECT (srcdata->''idReq'')::text::INT, srcdata->''idUser'' "idUser" FROM 
json_array_elements(
$1::json) srcdata   ///изменение тут
)
SELECT "idReq", array_agg("idUser") FROM
(SELECT "idReq", json_array_elements("idUser")::text::INT "idUser" FROM src WHERE json_array_length(src."idUser") != 0) q1
GROUP BY 1
UNION ALL
SELECT "idReq", ''{}''::INT[] "idUser" FROM src WHERE json_array_length(src."idUser") = 0;
END
SQL
1
'LANGUAGE plpgsql
Собственно с клиента приходит вышеупомянутый объект, его я передаю из Node запросом к функции постгреса:
....
Javascript
1
" SELECT test_executors($1)",[test], function (err,result)
....

Имеем ошибку:
error: invalid input syntax for type json
detail: 'Expected ":", but found ",".',
where: 'JSON data, line 1: {"{"idReq":1,"idUser":[173,154,163,179]",...', * по два \\ форум обрезает. ну если это важно.

Я так понимаю, я как то не так передаю или формирую json объект?

Добавлено через 8 минут
p.s. В принципе, я мог сформировать массив и такого вида, может поможет? Правда тогда нужно переписать весь запрос.
[ {1, [ 173, 154, 163, 179 ] },
{ 2, [ 191, 154 ] },
{ 3, [] },
{ 5, [] },
{ 6, [] } ]

Добавлено через 1 минуту
where: 'JSON data, line 1: {"{//"idReq//":1,//"idUser//":[173,154,163,179]}",...',

Добавлено через 5 минут
Javascript
1
SELECT test_executors($1)",[JSON.stringify(test)], function (err,result)
Вот это помогло, вроде бы. Но еще с ретурном намудрил.

Добавлено через 4 минуты
Короче, заработало)) Спасибо тебе, добрый человек. Надо еще в этом запросе разобраться, ну что к чему.

Добавлено через 27 секунд
Короче, заработало)) Спасибо тебе, добрый человек. Надо еще в этом запросе разобраться, ну что к чему.
0
25.04.2017, 17:53
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2017, 17:53
Помогаю со студенческими работами здесь

Выбор массива из многомерного массива по ключу
$array = array( array( 'id'=>'1', 'value'=>'Значение 1', ), array( ...

сотировка многомерного массива
есть массив $arResult - содержащий товары. выглядит так => Array ( =>...

Вывод многомерного массива
Доброго времени суток, впал в ступор с выводом массива, нужно создать из него (имеющегося массива)...

Перебор Многомерного массива
Уважаемые помогите перебрать многомерный массив if($qrand1){ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru