ОШИБКА: оператор не существует: целое число целое число[]

#postgresql

#postgresql

Вопрос:

Я пытаюсь создать функцию, в которой я передаю массив в качестве параметра.

Когда я пытаюсь выполнить функцию, я получаю следующую ошибку:

 [2020-12-07 13:53:58] [42883] ERROR: operator does not exist: integer <> integer[]
[2020-12-07 13:53:58] Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
[2020-12-07 13:53:58] Where: PL/pgSQL function vectors_paginated(uuid,text,integer[]) line 16 at IF
 

Это мой код:

 CREATE OR REPLACE FUNCTION vectors_paginated(analysisId uuid, vectorName text, actors int[])
RETURNS SETOF vectors  AS $
    DECLARE
        vector record;
        isValidVector bool;
    BEGIN
        FOR vector IN
            SELECT * FROM vectors AS aiv
            WHERE aiv.analysis_id = analysisId
        LOOP
            isValidVector:= true;
                
        IF isValidVector AND vectorName IS NOT NULL AND Lower(vector.name) NOT LIKE ('%' || Lower(vectorName) || '%') THEN
            isValidVector:= false;
        END IF;

        IF isValidVector AND actors IS NOT NULL AND vector.actor_type NOT IN (actors) THEN
            isValidVector:= false;
        END IF;

        IF isValidVector = true THEN
            RETURN NEXT vector;
        END IF;
        END LOOP;

        RETURN;
    END;
$ LANGUAGE plpgsql;



  SELECT COUNT(*) FROM vectors_paginated(
    '0066ae29-e0a7-4d3e-9ab6-a7903b3683a8',
    null,
    ARRAY[0, 1]);
 

Что я делаю не так?

Комментарии:

1. <> В коде, который вы нам показали, нет

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

Ответ №1:

not in не может использоваться с массивом, вам нужно использовать vector.actor_type <> ALL (actors)


Но я думаю, что всю вашу функцию можно существенно упростить, поместив ваши условия в WHERE и избавившись от медленной и неэффективной обработки по строкам:

 CREATE OR REPLACE FUNCTION vectors_paginated(analysisId uuid, vectorName text, actors int[])
  RETURNS SETOF vectors  
AS 
$
  SELECT aiv.*
  FROM vectors AS aiv
  WHERE aiv.analysis_id = analysisId
    AND (vectorName is NULL OR Lower(aiv.name) NOT LIKE '%' || Lower(vectorName) || '%')
    AND (actors IS NULL OR aiv.actor_type <> ALL (actors));
$
language SQL;