powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Удалить элемент массива?
25 сообщений из 29, страница 1 из 2
Удалить элемент массива?
    #39632582
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как удалить элемент из 2-мерного массива?


Делал так, получил ошибку
ERROR: removing elements from multidimensional arrays is not supported


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DO
$do$
DECLARE
   arr varchar[] := '{{key1,val1},{key2,val2},{key3,val3},{key4,val4}}';
BEGIN
   FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
   LOOP
   IF(arr[i][1]='key3')
   THEN
   arr:=array_remove(arr,arr[i]);
   END IF;
      RAISE NOTICE '% ) show(%,%)',i, arr[i][1], arr[i][2];
   END LOOP;
END
$do$
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632636
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

блин, не используйте многомерных арраев в пж никогда.

есть unnest(array1,....arrayN)
есть массивы типов
этого достаточно
не надо удалять элементы массивов -- оперируйте сетами. и фильтрами where / except / intersect на сетах.
единственный недостаток сета -- чтобы передать надо упаковать в массив.

на крайняк берите массив hstore / json
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632638
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин,

блин, не используйте многомерных арраев в пж никогда.

есть unnest(array1,....arrayN)
есть массивы типов
этого достаточно
не надо удалять элементы массивов -- оперируйте сетами. и фильтрами where / except / intersect на сетах.
единственный недостаток сета -- чтобы передать надо упаковать в массив.

на крайняк берите массив hstore / json

ясно, а я долбусь как раз с двумерным массивом, это п-ц....
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632639
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

и вообще не пишите на плпгскл как на приличном процедурном языке.
вы удивитесь. сколько там накладных расходов.

пишите с максимальным использованием встроенных в скл фичей.
или на других процедурных языках.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632649
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DO
$do$
DECLARE
   arr varchar[] := '{"{key1,val1}","{key2,val2}","{key3,val3}","{key4,val4}"}';
BEGIN
   FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
   LOOP
   IF(((arr[i])::text[])[1]='key3')
   THEN
   arr:=array_remove(arr,arr[i]);
   END IF;
      RAISE NOTICE '% ) show(%,%)',i, (arr[i]::text[])[1], (arr[i]::text[])[2];
   END LOOP;
END
$do$



но не надо так мелко кодить в плпгскл. не надо.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632651
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DO
$do$
DECLARE
   arr varchar[] := '{"{key1,val1}","{key2,val2}","{key3,val3}","{key4,val4}"}';
BEGIN
   FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
   LOOP
   IF(((arr[i])::text[])[1]='key3')
   THEN
   arr:=array_remove(arr,arr[i]);
   END IF;
      RAISE NOTICE '% ) show(%,%)',i, (arr[i]::text[])[1], (arr[i]::text[])[2];
   END LOOP;
END
$do$



но не надо так мелко кодить в плпгскл. не надо.

хмм... я практически первый раз в большом городе (ц)
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632752
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин,

и вообще не пишите на плпгскл как на приличном процедурном языке.
вы удивитесь. сколько там накладных расходов.

пишите с максимальным использованием встроенных в скл фичей.
или на других процедурных языках.


Как джойнуть два массива?
Создается двумерный массив целых, затем хотелось бы сделать выборку. джойнув самого с собой, типа такого

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	SELECT s1.pos as pos1, s2.pos as pos2
        INTO var_pos1,var_pos2
        FROM
	        (   select pos,sym from unnest(var_nest) ) s1
        INNER JOIN
	        (   select pos,sym from unnest(var_nest)) s2
        ON s2.pos > s1.pos
        WHERE (s1.sym = 0)  AND (s2.sym = 1);



но в нем колонки не именованные... как?
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632801
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в jsonb именованные
и там, собсно, как обычно: arr1[arr2['var1']]
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632805
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DO
$do$
DECLARE
   arr varchar[] := '{"{key1,val1}","{key2,val2}","{key3,val3}","{key4,val4}"}';
BEGIN
   FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
   LOOP
   IF(((arr[i])::text[])[1]='key3')
   THEN
   arr:=array_remove(arr,arr[i]);
   END IF;
      RAISE NOTICE '% ) show(%,%)',i, (arr[i]::text[])[1], (arr[i]::text[])[2];
   END LOOP;
END
$do$



но не надо так мелко кодить в плпгскл. не надо.
даже если в цикле не запускать?

зы: Иван Фролков утверждает, что ф-я на PL/PGSQL окажется быстрее, чем ф-я в консоле на SQL-е. Ф-я конечно возвращает результат. Это будет заметно, если активно её использовать.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632810
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78зы: Иван Фролков утверждает, что ф-я на PL/PGSQL окажется быстрее, чем ф-я в консоле на SQL-е. Ф-я конечно возвращает результат. Это будет заметно, если активно её использовать.
YouTube Video
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632850
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Как джойнуть два массива?
Создается двумерный массив целых

но в нем колонки не именованные... как?
мальчик , ты слепой ?

1. не создавать многомерных массивов. совсем.
создайте 2 линейных. и попользуйте unnest как питоновский zip
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with vdata AS (
SELECT array_agg(i-1 order by i) apos
,array_agg(i+1 order by i) asym
FROM generate_series(0,1000,6) i 
)

SELECT foo.* 
FROM vdata 
,lateral
(SELECT s1.pos as pos1, s2.pos as pos2
FROM
(select pos,sym from unnest(apos ,asym) u(pos,sym) ) s1
INNER JOIN
(
select pos,sym from unnest(apos ,asym) u(pos,sym)) s2
ON s2.pos > s1.pos
WHERE (s1.sym = 37)  AND (s2.sym = 73)
) foo
--INTO var_pos1,var_pos2
;
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632853
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. создать свой тип и юзать одномерный массив своего типа.
если лень создавать -- использовать прослойку из текста:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with vdata AS (
SELECT
array_agg(array[i-1,i+1]::text order by i) apos_sym
FROM generate_series(0,1000,6) i 
)

SELECT foo.* 
FROM vdata 
,lateral
(SELECT s1.pos as pos1, s2.pos as pos2
FROM
(select (u::int[])[1] as pos,(u::int[])[2] as sym from unnest(apos_sym) u(u) ) s1
INNER JOIN
(select (u::int[])[1] as pos,(u::int[])[2] as sym from unnest(apos_sym) u(u) ) s2
ON s2.pos > s1.pos
WHERE (s1.sym = 37)  AND (s2.sym = 73)
) foo
--INTO var_pos1,var_pos2
;
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632857
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3 если уж создал "иногомерную бяку" (туда можно положить хоть те что. за размерности "членов" отвечает кодер)
-- доставать индексно ,в надежде, что крокодила не засунул.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with vdata AS (
SELECT
array_agg(array[i-1,i+1] order by i) apos_sym
FROM generate_series(0,1000,6) i 
)

SELECT foo.*
FROM vdata v
,lateral
(SELECT s1.pos as pos1, s2.pos as pos2
FROM
(select pos, apos_sym[u.ord/2+1][2] sym from unnest(apos_sym)
with ordinality u(pos, ord)
where u.ord % 2 = 1
) s1
INNER JOIN
(select pos, apos_sym[u.ord/2+1][2] sym from unnest(apos_sym)
with ordinality u(pos, ord)
where u.ord % 2 = 1
) s2
ON s2.pos > s1.pos
WHERE (s1.sym = 37)  AND (s2.sym = 73)
) foo
--INTO var_pos1,var_pos2
;




ну и т.п.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632865
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

это свободная лабуда была или чёс?


не надо нам этих невнятных чтецов показывать
читать лекции это отдельное искусство. этому вот не дано.
т.е. совсем.
мысль должна акцентироваться.
а хороший человек -- не профессия.


зы:
он с препаредом хоть сравнивался ?хехе
я какбе так и не услышал акцента.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632895
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq, сорри, не понимаю птичий язык.
лектор никакой, потому что многолетний опыт оптимизации промышленных запросов это "чёс".
лекция говно, потому что отличается от вашего мнения.
оK. аргументации выше крыши. принято.
(вообще там даже я понял всё, что он сказал, но раз гуру сказал "невнятно", значит "лабуда")
выкладывайте тогда свои "внятные" лекции, заценим
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632912
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78qwwq, сорри, не понимаю птичий язык.
лектор никакой, потому что многолетний опыт оптимизации промышленных запросов это "чёс".
лекция говно, потому что отличается от вашего мнения.
оK. аргументации выше крыши. принято.
( вообще там даже я понял всё , что он сказал, но раз гуру сказал "невнятно", значит "лабуда")
выкладывайте тогда свои "внятные" лекции, заценим
"ты не мудри, ты пальцем покажи"

ели сможешь не растекаясь лабудой выразить понятую мысль -- она "там" есть

но пока я вижу одного соплежуя за другим во всей этой геркулесовой лекционной каше
под прикрытием сетевых лабутнангов с кашей во рту

пишут на хабре они чуточку внятнее, это плюс
уже профит

тратить же время на бесмыслленное бормотание тривиальностей в камеру -- как нибудь без меня


и таки повторю вопрос: этот пуп с горы во время платного чёса записан или от безделия дурью маялся ?
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39632952
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq3 если уж создал "иногомерную бяку" (туда можно положить хоть те что. за размерности "членов" отвечает кодер)
-- доставать индексно ,в надежде, что крокодила не засунул.

ну и т.п.

Создал, но это исправимо, это всё попытки избежать временных таблиц, в T-SQL сдлано с @таблицей, вот я и колбашусь
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39633021
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq3 если уж создал "иногомерную бяку" (туда можно положить хоть те что. за размерности "членов" отвечает кодер)
-- доставать индексно ,в надежде, что крокодила не засунул.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with vdata AS (
SELECT
array_agg(array[i-1,i+1] order by i) apos_sym
FROM generate_series(0,1000,6) i 
)

SELECT foo.*
FROM vdata v
,lateral
(SELECT s1.pos as pos1, s2.pos as pos2
FROM
(select pos, apos_sym[u.ord/2+1][2] sym from unnest(apos_sym)
with ordinality u(pos, ord)
where u.ord % 2 = 1
) s1
INNER JOIN
(select pos, apos_sym[u.ord/2+1][2] sym from unnest(apos_sym)
with ordinality u(pos, ord)
where u.ord % 2 = 1
) s2
ON s2.pos > s1.pos
WHERE (s1.sym = 37)  AND (s2.sym = 73)
) foo
--INTO var_pos1,var_pos2
;




ну и т.п.

как модифицировать элементы - такой вот гамлЕтовский вопрос встал
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39633033
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинqwwq3 если уж создал "иногомерную бяку" (туда можно положить хоть те что. за размерности "членов" отвечает кодер)
-- доставать индексно ,в надежде, что крокодила не засунул.
...


ну и т.п.

как модифицировать элементы - такой вот гамлЕтовский вопрос встал
а как делали ? и что не получилось ?

зы : "не использовать многомерных массивов в пж" -- понимает ли упоротствующий русский язык ?
если да -- почему отлынивает -- " тут грабли, тут прыгай "
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39633133
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупинпропущено...


как модифицировать элементы - такой вот гамлЕтовский вопрос встал
а как делали ? и что не получилось ?

зы : "не использовать многомерных массивов в пж" -- понимает ли упоротствующий русский язык ?
если да -- почему отлынивает -- " тут грабли, тут прыгай "

Понял, что не использовать, пытаюсь... Но для такой задачи с трудом получается, там итерации, в оригинале по временной таблице, ну, вот....

Нашел функцию, которая занимается удалением
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39633148
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинqwwqпропущено...

а как делали ? и что не получилось ?

зы : "не использовать многомерных массивов в пж" -- понимает ли упоротствующий русский язык ?
если да -- почему отлынивает -- " тут грабли, тут прыгай "

Понял, что не использовать, пытаюсь... Но для такой задачи с трудом получается, там итерации, в оригинале по временной таблице, ну, вот....

Нашел функцию, которая занимается удалением
ну и создайте свой тип с теми же полями.
и берите массив типов.

на крайняк можно так :

Код: sql
1.
2.
3.
create type myarr as (f int[]);
with datas as (select array_agg( row(array[i,j,i+1,j+1])::myarr ) ag from generate_series(0,100) i,generate_series(0,100)j)
SELECT u.*,w, u.f[4] from datas ,lateral unnest(ag) u, lateral unnest(u.f) w


но задайтесь вопросом, что происходит с "массивом" в пж, когда меняется его "элемент"
там всё печально, вообще то.
по крайней мере когда я в последний раз что-то такое делал.
попробуйте не "удалять". работайте с сетами и агрегируйте в концах "передачи" с фильтрованием -- сверьте времена.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39633238
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупинпропущено...


Понял, что не использовать, пытаюсь... Но для такой задачи с трудом получается, там итерации, в оригинале по временной таблице, ну, вот....

Нашел функцию, которая занимается удалением
ну и создайте свой тип с теми же полями.
и берите массив типов.

на крайняк можно так :

Код: sql
1.
2.
3.
create type myarr as (f int[]);
with datas as (select array_agg( row(array[i,j,i+1,j+1])::myarr ) ag from generate_series(0,100) i,generate_series(0,100)j)
SELECT u.*,w, u.f[4] from datas ,lateral unnest(ag) u, lateral unnest(u.f) w


но задайтесь вопросом, что происходит с "массивом" в пж, когда меняется его "элемент"
там всё печально, вообще то.
по крайней мере когда я в последний раз что-то такое делал.
попробуйте не "удалять". работайте с сетами и агрегируйте в концах "передачи" с фильтрованием -- сверьте времена.

Ясно, пересмотрю код, надежда на то, что массивы небольшие.
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39633409
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

обещают в 11 что-ли "труЪ" процедурки. если это то, что я думаю, то или всё с массивами в т.ч. получшеет. или что-то уже могли протащить

или это не то, что я подкмал
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39639045
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут потестил селекты в мультиэррай
суть: у акта есть договор, а у договора есть клиент, и когда я запрашиваю клиента, то должен увидеть все записи с договорами И с актами
а когда запрашиваю договор, то должен увидеть все его акты
т.е. когда идёт INSERT, то у акта должны быть 2 записи: для договор + акт И клиент + акт

1 вариант - INNER JOIN, в одной таблице сами записи, в другой соответствия child_id,parent
Код: sql
1.
SELECT lo.* FROM logs_parents lp JOIN logs lo ON lp.id=lo.id WHERE parent=9003890;


2 вариант - всё в одной таблице и есть колонка с массивом: '{parent,parent,parent}' - перечисляются ВСЕ родаки на чей запрос надо показывать эту строку
у массива индекс GIN
Код: sql
1.
select * from logs where parents @> '{9003890}'



ИТОГ: одинаковый результат
при этом для второго вара `id` не нужна и -1 лишний индекс и таблица
...
Рейтинг: 0 / 0
Удалить элемент массива?
    #39639052
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тестил на 1.2млн строк, результат - 0,6мс
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Удалить элемент массива?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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