С Новым годом! Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/65: Рейтинг темы: голосов - 65, средняя оценка - 4.78
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314

Удалить элемент с массива

05.02.2013, 01:08. Показов 13737. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго вечера.
как можно с массива удалить элемент?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2013, 01:08
Ответы с готовыми решениями:

Удалить первый отрицательный элемент массива, если такой элемент есть
1. Удалить первый отрицательный элемент массива, если такой элемент есть. 2. Вставить два элемента с данными значениями: первый – после...

Если элемент найден, то удалить его и следующий за ним элемент из массива
Сформировать массив x, упорядоченный по убыванию. Определить, содержит ли он заданное число. Если элемент найден, то удалить его и...

Удалить из массива элемент и вставить на нужное место элемент q, так, чтобы не нарушалась упорядоченность
Здравствуйте! Вот сама задача Заданы целочисленный массив а1,а2...аn упорядоченный по не возрастанию элементов и целочисленные переменные...

22
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
05.02.2013, 13:20
Пока не знаю как связать ваш вопрос с postgres?
Имеется в виду, что у вас тип данных массив и нужно изменить его, удалив что-то?
Такая операция делается созданием нового массива.
Прямой функции удаления я что-то не припомню (http://www.postgresql.org/docs... array.html)

Вообще в теории, такой абстрактный тип данных как массив по умолчанию не предполагает иметь операцию добавления или удаления элемента. Такой вид операций больше присущ спискам.
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
05.02.2013, 21:48  [ТС]
Плохо что нет такого метода.

P.S.
Вопрос поняли правильно.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
06.02.2013, 15:32
рассмотрите вариант представления массива отдельной таблицей.
общепринятая практика, но тоже есть свои недостатки
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
06.02.2013, 21:58  [ТС]
Это что на каждое поле создавать таблицу?
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
08.02.2013, 00:01
нет. примерно так...

пусть есть таблица

SQL
1
2
3
4
5
6
CREATE TABLE test
(
test_id INTEGER,
test_names VARCHAR(64)[],
CONSTRAINT testpk PRIMARY KEY (test_id)
);
тогда поле test_names, массив строк, можно заменить на связь с другой таблицей test_names_array.
В итоге можем получить следующее:

SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE test_names_array (
test_names_id INTEGER PRIMARY KEY,
test_names_index INTEGER,
test_names_value VARCHAR(64),
);
 
CREATE TABLE testnew
(
test_id INTEGER PRIMARY KEY,
test_names INTEGER REFERENCES test_names_array(test_names_id)
);
index - поле, отвечающее за индекс массива

в результате запросы:
* на добавление в массив: найти максимальный индекс, прибавить 1, записать значение в массив
* на удаление из массив: запомнить удаляемый индекс, заменить его значение на 0, уменьшить на единицу все другие индексы, которые больше запомненного

В приницпе эти операции можно реализовать тригерами для таблицы array.
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
10.02.2013, 23:12  [ТС]
Не совсем понятно всей идеи. У меня есть три таблицы tbl_films, tbl_genres и tbl_relations в таблице tbl_relations есть три поля id, genre_id int[], film_id int. И все вроде хорошо до момента когда удаляется в таблице tbl_genres запись, нужен запрос для обновления массива. Все операции insert, update, select все отлично устраивает.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
12.02.2013, 15:49
Ошибся я в ограничениях, извиняюсь. Так правильнее

Была таблица с полем массив строк

SQL
1
2
3
4
5
6
CREATE TABLE test
(
  test_id INTEGER NOT NULL,
  test_names CHARACTER VARYING(64)[],
  CONSTRAINT testpk PRIMARY KEY (test_id )
);
Заменяем массив строк у каждого экземпляра сущности test на доп. таблицу,
описывающую этот же экземпляр (внешний ключ) сущности с доп. полями индекса и значения строки аналогично массиву

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE testnew
(
  test_id INTEGER NOT NULL,
  CONSTRAINT testnew_pkey PRIMARY KEY (test_id )
);
CREATE TABLE testnew_names_array
(
  test_names_id INTEGER NOT NULL,
  test_names_index INTEGER NOT NULL,
  test_names_value CHARACTER VARYING(64),
  CONSTRAINT array_pk PRIMARY KEY (test_names_id , test_names_index ),
  CONSTRAINT array_fk FOREIGN KEY (test_names_id)
      REFERENCES testnew (test_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
);
В вашем случае tbl_films и tbl_genres связываются отношение многие-ко-многим.
Не очень понятно зачем тут массив в принципе, если его можно заменить простой таблицей
как ниже. Каскадность ограничений автоматически будет удалять (обновлять) зависимые записи.

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
CREATE TABLE tbl_film
(
   film_id INTEGER,
   film_name CHARACTER VARYING(128),
   ....
   PRIMARY KEY (film_id)
);
CREATE TABLE tbl_genre
(
   genre_id INTEGER,
   genre_name CHARACTER VARYING(128),
   PRIMARY_KEY (genre_id)
);
CREATE TABLE tbl_film_genre
(
  film_id INTEGER,
  genre_id INTEGER,
  CONSTRAINT tbl_film_genre_film_id_fkey FOREIGN KEY (film_id)
      REFERENCES tbl_film (film_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT tbl_film_genre_genre_id_fkey FOREIGN KEY (genre_id)
      REFERENCES tbl_genre (genre_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
);
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
13.02.2013, 00:39  [ТС]
А чем плохо использовать массив? Удобно собрать строку определить ее в массив и сохранить
SQL
1
INSERT INTO tbl (val) VALUES(mas_id)
и редактировать
SQL
1
UPDATE tbl SET val = mas_id ...
И ни каких связок.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
13.02.2013, 20:18
Массив плох тем, что имеет нереляционную "природу".
Нету прямых SQL-операций для работы с ним, только написание каких-нибудь "примочек".
Поэтому и удобнее рассматривать различные варианты представления массива в реляционном виде - через сущности и связи (таблицы и ограничения).
Выбор формы представления зависит от задачи.
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
13.02.2013, 23:45  [ТС]
А для чего тогда был придуман массив в postgresql?
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
14.02.2013, 20:08
Бывают случаи, когда и они нужны. Чаще всего для таблиц-результатов хранения аналитических отчетов.
Там, итоги... подитоги всякие, чтобы не надо было доп. подзапросы составлять для выборки клиенту.
Во всяком случае, я больше не знаю разумного применения.
0
2891 / 1926 / 208
Регистрация: 05.06.2011
Сообщений: 5,638
15.02.2013, 15:58
Цитата Сообщение от rave82 Посмотреть сообщение
как можно с массива удалить элемент?
Нисколько не спорю с тем, что реляционная теория не допускает массивов в полях, но таки удалить элемент -- ну, на худой конец, написать функу, которая сделает другой массив, перепишет в него все элементы, кроме ненужного, и вернёт новый массив. Эту функу можно потом вызвать в update. С какого места проблем?
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
16.02.2013, 15:10
Цитата Сообщение от iifat Посмотреть сообщение
С какого места проблем?
это как прочитать?

Вот пример использования. Дана таблица

SQL
1
2
3
4
5
6
CREATE TABLE test
(
  id INTEGER NOT NULL,
  array_field INTEGER[],
  CONSTRAINT test_pkey PRIMARY KEY (id )
);
Заполняем данными
SQL
1
2
3
INSERT INTO test (id, array_field) VALUES (1, '{1,2,3,4,5,6,7,8,9}');
INSERT INTO test (id, array_field) VALUES (2, '{1,2,3,4,5,6,7,8,9}');
INSERT INTO test (id, array_field) VALUES (3, '{1,2,3,4,5,6,7,8,9}');
Создаем функцию удаления элемента по значению

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE FUNCTION deletebyvalue(in_array INTEGER[], del_index INTEGER)
  RETURNS INTEGER[] AS
$BODY$declare
  res INTEGER[];
  i INTEGER := 0;
  k INTEGER := 0;
BEGIN
  FOR i IN array_lower(in_array, 1)..array_upper(in_array, 1)
  loop
    IF in_array[i] = del_value
    THEN
      k = k + 1;
    ELSE
      res[i - k] = in_array[i];
    END IF;
  END loop;
  RETURN res;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Создаем запрос удаления элемента со значением, например, 5

SQL
1
UPDATE test SET array_field=deletebyvalue(array_field, 5);
Получаем на выходе

SQL
1
2
3
1;"{1,2,3,4,6,7,8,9}"
2;"{1,2,3,4,6,7,8,9}"
3;"{1,2,3,4,6,7,8,9}"
1
2891 / 1926 / 208
Регистрация: 05.06.2011
Сообщений: 5,638
16.02.2013, 15:36
Цитата Сообщение от grgdvo Посмотреть сообщение
Создаем функцию удаления элемента

Не по теме:

Спасибо, что перевёл мои слова на язык человеков и Постгреса. Какой же я, оказывается, лаконичный! ;)

0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
19.02.2013, 00:13  [ТС]
Спасибо за примеры. Функция для удаления элемента массива вот вариант более простой

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE FUNCTION mas_del(int[], int[]) returns int[] AS
$body$
DECLARE 
mas_id int[] DEFAULT $1;
mas_id2 int[] DEFAULT $2;
 
BEGIN
   
   RETURN (SELECT array_agg(mas) FROM unnest(mas_id) mas WHERE mas <> ALL(mas_id2));
END;
$body$
 
language 'plpgsql';
И попутный вопрос как вернуть из функции таблицу? Пример который нашел возвращает рекорд(строка разделенная запятой), а это немного не то.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
19.02.2013, 14:28
Цитата Сообщение от rave82 Посмотреть сообщение
Oracle 11 SQL
1
2
3
BEGIN
    RETURN (SELECT array_agg(mas) FROM unnest(mas_id) mas WHERE mas <> ALL(mas_id2));
END;
О круто! коротко... А я мало массивами пользовался, даже сразу в голову и не пришло такие функции использовать.

Цитата Сообщение от rave82 Посмотреть сообщение
И попутный вопрос как вернуть из функции таблицу? Пример который нашел возвращает рекорд(строка разделенная запятой), а это немного не то.
Нужно использовать понятие курсора
См. описание и примеры здесь.
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
26.02.2013, 01:59  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
Oracle 11 SQL
1
CREATE TABLE tbl_film ( film_id INTEGER, film_name CHARACTER VARYING(128), .... PRIMARY KEY (film_id) ); CREATE TABLE tbl_genre ( genre_id INTEGER, genre_name CHARACTER VARYING(128), PRIMARY_KEY (genre_id) ); CREATE TABLE tbl_film_genre ( film_id INTEGER, genre_id INTEGER, CONSTRAINT tbl_film_genre_film_id_fkey FOREIGN KEY (film_id) REFERENCES tbl_film (film_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT tbl_film_genre_genre_id_fkey FOREIGN KEY (genre_id) REFERENCES tbl_genre (genre_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE )
;
Вот попробовал этот пример, все создалось вроде как связалось и возник вопрос Select,Insert,Delete понятно, а с Update что то никак не въеду принцип его действия, может кто нибудь пояснить как оно работает.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
26.02.2013, 14:45
update используется для изменения значений существующих записей в таблицах

Добавлено через 31 минуту
документацию пробовали прочитать? что там объяснять - не знаю... все понятно
0
23 / 23 / 11
Регистрация: 05.02.2010
Сообщений: 314
26.02.2013, 22:11  [ТС]
Я знаю для чего Update и как его используют, вопрос как он здесь работает
SQL
1
2
3
4
CONSTRAINT array_pk PRIMARY KEY (test_names_id , test_names_index ),
  CONSTRAINT array_fk FOREIGN KEY (test_names_id)
      REFERENCES testnew (test_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
Если у меня есть три таблицы films,genres и relations которая хранит связь между фильмом и жанром. Например добавляю новый фильм устанавливаю ему три жанра благополучно добавляю, а потом если я хочу отредактировать запись добавить к фильму один(или удалить) жанр как отдавать в таблицу данные для редактирования?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2013, 22:11
Помогаю со студенческими работами здесь

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

Удалить каждый K элемент массива пока не останется 1 элемент
Есть задача удалить каждый K элемент массива пока не останется 1 уцелевший. Вот пример вводим N к-лово элементов в нумерации ...

Удалить из массива элемент, стоящий в центре (если количество элементов в массиве чётное, то удалить средние два элемента).
Удалить из массива элемент, стоящий в центре (если количество элементов в массиве чётное, то удалить средние два элемента).

Удалить первый нулевой элемент массива и добавить после каждого чётного элемента особый элемент
Здравствуйте! Имеется такая задача: 1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2) Распечатать...

Удалить первый положительный элемент массива; вставить новый элемент перед первым максимальным элементом
Дан целочисленный массив размера N. Как удалить первый положительный элемент ? Как вставить новый элемент перед первым максимальным...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru