Пересечение нескольких текстовых массивов: ОШИБКА: значение массива должно начинаться с {

Я пытаюсь заставить работать функции в этом вопросе: Пересечение нескольких массивов в PostgreSQL

В отличие от этого вопроса, я хочу пересекать текстовые массивы вместо целочисленных массивов. Я соответствующим образом изменил обе функции. Функция пересечения базового массива:

CREATE FUNCTION array_intersect(a1 text[], a2 text[]) RETURNS text[] AS $$
DECLARE
    ret text[];
BEGIN
    IF a1 is null THEN
        return a2;
    ELSEIF a2 is null THEN
        RETURN a1;
    END IF;
    SELECT array_agg(e) INTO ret
    FROM (
        SELECT unnest(a1)
        INTERSECT
        SELECT unnest(a2)
    ) AS dt(e);
    RETURN ret;
END;
$$ language plpgsql;

Определение агрегатной функции:

CREATE AGGREGATE utility.array_intersect_agg(
    sfunc    = array_intersect,
    basetype = text[],
    stype    = text[],
    initcond = NULL
);

Я получаю сообщение об ошибке «ОШИБКА: значение массива должно начинаться с «{» или состояния SQL с информацией о измерении: 22P02», когда я пытаюсь запустить следующий код:

SELECT array_intersect_agg(test)
  FROM(
    SELECT ARRAY['A','B','C'] test
    UNION ALL
    SELECT ARRAY['A','C'] test
    ) a

Что нужно изменить, чтобы эти функции заработали?


person danjuggler    schedule 08.12.2015    source источник


Ответы (1)


Для документации:

начальное_условие

Начальная установка значения состояния. Это должна быть строковая константа в форме, принятой для типа данных state_data_type. Если не указано, значение состояния начинается с нуля.

Таким образом, совокупное объявление должно выглядеть так:

CREATE AGGREGATE array_intersect_agg(
    sfunc    = array_intersect,
    basetype = text[],
    stype    = text[]
);
person klin    schedule 08.12.2015