#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;