Ошибка с функцией ANY

База данных PostgreSQL Имеется такая вот функция

CREATE OR REPLACE FUNCTION loop_over_rows() RETURNS BOOLEAN AS $$
DECLARE rec RECORD;
BEGIN
    FOR rec IN SELECT duplicates FROM public.tmp LOOP
        UPDATE public.table SET field_id = MIN(rec) WHERE field_id = ANY (rec);
    END LOOP;
    RETURN TRUE;
END;
$$ LANGUAGE PLPGSQL;

Мы из таблицы tmp берем поочередно массив чисел (bigint []) В другой таблице есть поле, которое может содержать значения из этого взятого массива. И если нашлась такая строка, то этому полю мы присваиваем минимальное значение из этого массива.

При выполнение выдает следующую ошибку

ERROR: ОШИБКА:  для операторов ANY/ALL (с массивом) требуется массив справа

Таблица tmp состоит из одного столбца bigint[] (duplicates - название столбца) К примеру

{1001, 1004}
{1122, 1234, 1102}
и т.д

Таблица table состоит из двух столбцов id и field_id

1 1001
2 1003
3 1004
4 1102 

Я хочу взять массив из первой таблицы, к примеру {1001, 1004}. Найти во второй таблице все строки, в которых field_id равна хотя бы какому то из значений во взятом массиве. И заменить в этой найденной строке field_id на минимальное значение из взятого массива. То, что я описал - я делаю в своей функции. Но как я понял, делаю что-то не так.


Ответы (1 шт):

Автор решения: Mike

Если я правильно понял, где у вас тут массив, а где что, то цикл вам вообще не нужен, а весь запрос сведется к:

UPDATE public.table
   SET field_id = min_val
  FROM (
      select (select min(x) from unnest(duplicates) as x) min_val,
             unnest(duplicates) val
        from public.tmp
  ) q
 WHERE field_id = val

Основной в запросе является функция unnest(), которая разбирает массив на отдельные записи.

→ Ссылка