powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / работа с массивами
11 сообщений из 11, страница 1 из 1
работа с массивами
    #38662554
Mikhail S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В функцию передается два численных массива. Надо вставить их в таблицу, каждый массив в свою колонку. Количество элементов в массиве одинаково. Например, первый массив [1,2,3,4], второй [5,6,7,8]. В таблице тест должно быть четыре записи, первая (1,5), вторая (2,6) и т.д.

Мое решение мне не нравится. Ничего не могу придумать, кроме как получить длину массива и организовать цикл по элементам, на каждой итерации выполняя insert. А хотелось бы одним insert .. from .. . Unnest здесь тоже не помогает, т.к. не может преобразовать в двумерный массив.
...
Рейтинг: 0 / 0
работа с массивами
    #38662567
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Mikhail S., где тут двумерный массив?
...
Рейтинг: 0 / 0
работа с массивами
    #38662576
Mikhail S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
V&N,

Тут его нету, но если бы его динамически получить на основании двух входных массивов, можно было бы массовой операцией вставить в таблицу. В общем, это мысли в слух. Условие изложены в первом абзаце.
...
Рейтинг: 0 / 0
работа с массивами
    #38662592
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Mikhail S., давайте код, который не нравится.

unnest должен работать.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select unnest(a), unnest(b)
  from (select '{1,2,3,4}'::int[] as a, '{5,6,7,8}'::int[] as b) foo

with foo as (select '{1,2,3,4}'::int[] as a, '{5,6,7,8}'::int[] as b)  
select a[i], b[i] 
  from foo, 
       generate_series(1, greatest(array_length(foo.a,1), array_length(foo.b,1))) i
...
Рейтинг: 0 / 0
работа с массивами
    #38662663
Mikhail S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
V&N,

решение было примерно таким. Хотел оформить без цикла.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DO $$
declare 
   param1 integer[]; 
   param2 float[];
   n int;
   i int;
BEGIN
   param1 := array[1,2,3,4];
   param2 := array[100.0,200.4,378.9,284.67];
   i := 1;
   n := greatest(array_length(param1,1), array_length(param2,1));
   loop
      insert into test ("id", "price") values (param1[i], param2[i]);
      i := i + 1;   
      exit when i > n;
   end loop;
END $$;
...
Рейтинг: 0 / 0
работа с массивами
    #38662696
Mikhail S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
V&N,

второй ваш запрос выкидывает ошибку
ОШИБКА: в выражении с функцией во FROM нельзя ссылаться на другие отношения на том же уровне запроса
LINE 4: generate_series(1, greatest(array_length(foo.a,1), ar...
...
Рейтинг: 0 / 0
работа с массивами
    #38662697
Mikhail S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось оформить без цикла
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DO $$
declare 
   param1 integer[]; 
   param2 float[];
BEGIN
   param1 := array[1,2,3,4];
   param2 := array[100.0,200.4,378.9,284.67];

   insert into test("id", "price")
   select unnest(a), unnest(b)
      from (select param1 as a, param2 as b) foo;
END $$;



V&N, спасибо :)
...
Рейтинг: 0 / 0
работа с массивами
    #38662702
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Mikhail S., у меня работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
postgres-# select a[i], b[i]
postgres-#   from foo,
postgres-#        generate_series(1, greatest(array_length(foo.a,1), array_length(foo.b,1))) i;
 a | b
---+---
 1 | 5
 2 | 6
 3 | 7
 4 | 8
(4 строки)
...
Рейтинг: 0 / 0
работа с массивами
    #38662709
Mikhail S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
V&N,
Возможно, у из-за версии. Мы используем версию 9.1.
...
Рейтинг: 0 / 0
работа с массивами
    #38662713
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Mikhail S.,
Код: plaintext
1.
2.
3.
4.
with foo as (select '{1,2,3,4}'::int[] as a, '{5,6,7,8}'::int[] as b)  
select a[i], b[i] 
  from foo, 
       generate_series(1, greatest(array_length((select a from foo),1), array_length((select b from foo),1))) i

вместо generate_series можно использовать generate_subscripts.

новые версии >= 9.3 хавают из-за фичи LATERAL
...
Рейтинг: 0 / 0
работа с массивами
    #38662752
Timonishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
insert into table
select array[key::int, value::int] 
from each(hstore(array[1,2,3,4]::text[],array[5,6,7,8]::text[]))


лаконично, но попахивает :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / работа с массивами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]