Postgresql PostreSQL-“;运算符不存在:字符变化=字符变化[]:将数组传递给任何对象时?
我有一个plpgsql函数,它返回一个varchar[]Postgresql PostreSQL-“;运算符不存在:字符变化=字符变化[]:将数组传递给任何对象时?,postgresql,plpgsql,Postgresql,Plpgsql,我有一个plpgsql函数,它返回一个varchar[] CREATE OR REPLACE FUNCTION public.get_distr_parents(distr_id character varying) RETURNS character varying[] LANGUAGE plpgsql AS $function$ DECLARE all_ids VARCHAR[]; parent_id VARCHAR(6); cur_id
CREATE OR REPLACE FUNCTION public.get_distr_parents(distr_id character varying)
RETURNS character varying[]
LANGUAGE plpgsql
AS $function$
DECLARE
all_ids VARCHAR[];
parent_id VARCHAR(6);
cur_id VARCHAR(6) := distr_id;
BEGIN
all_ids := all_ids || distr_id;
parent_id := (SELECT dl.parent_distr_id FROM distribution_list dl WHERE dl.id = distr_id);
WHILE (parent_id IS NOT NULL) LOOP
all_ids := all_ids || parent_id;
cur_id := parent_id;
parent_id := (SELECT dl.parent_distr_id FROM distribution_list dl WHERE dl.id = cur_id);
END LOOP;
RETURN all_ids;
END;
$function$
;
该函数似乎按预期工作(例如,它返回一个数组,如{2,1}
)
但是,我正在尝试执行一个查询,以返回ID位于返回数组中的记录:
SELECT * FROM distribution_list dl
WHERE dl.id = ANY((SELECT get_distr_parents('5305')));
此查询返回一个错误:
SQL Error [42883]: ERROR: operator does not exist: character varying = character varying[]
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
Position: 50
但是,以下操作执行得很好:
SELECT * FROM distribution_list dl
WHERE dl.id = ANY(ARRAY((SELECT get_distr_parents('5305'))));
尽管上述方法可行,但我宁愿避免每次都将其包装在数组中(特别是因为我计划在Java程序中使用它)
我错过了什么?如果函数已经返回了一个数组,为什么将它包装在array()
中会改变行为
谢谢。尝试
dl.id=ANY(获取分发父母('5305'))
或更改函数以返回字符变化集,并在中使用(选择获取分发父母('5305'))
。非常感谢没有名字的@a\u horse\u。这么简单,但我花了比我愿意承认的更多的时间试图研究和解决这个问题。找不到与我的确切案例相符的文档。