Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql PostreSQL-“;运算符不存在:字符变化=字符变化[]:将数组传递给任何对象时?_Postgresql_Plpgsql - Fatal编程技术网

Postgresql PostreSQL-“;运算符不存在:字符变化=字符变化[]:将数组传递给任何对象时?

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

我有一个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 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。这么简单,但我花了比我愿意承认的更多的时间试图研究和解决这个问题。找不到与我的确切案例相符的文档。