Mr.*_*dox 4 arrays postgresql function
我正在尝试创建一个简单的PostgreSQL函数,其中通过使用INT参数我喜欢将数组返回.下面的例子不起作用,但应该知道我试图从函数中获取的内容.谢谢.
CREATE OR REPLACE FUNCTION contact_countries_array(INT)
RETURNS ANYARRAY AS '
SELECT ARRAY[contacts_primarycountry, contacts_othercountry] FROM contacts WHERE contacts_id = $1'
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
contacts_primarycountry和contacts_othercountry的数据类型是整数.contacts_id是唯一且整数.
根据文档:
允许具有固定返回类型的多态参数,但反之则不然.
因此,我认为你的回归尝试是anyarray行不通的.
你的字段看起来像文字,所以我想如果你把它改成这样的东西,它会起作用:
CREATE OR REPLACE FUNCTION contact_countries_array(INT)
RETURNS text[] AS $$
select array[contacts_primarycountry::text, contacts_othercountry::text]
FROM contacts WHERE contacts_id = $1
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
这应该编译,它可能会工作,但我真的不确定:
CREATE OR REPLACE FUNCTION contact_countries_array(anyelement)
RETURNS anyarray AS $$
select array[contacts_primarycountry::text, contacts_othercountry::text]
FROM contacts WHERE contacts_id = $1
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
我认为数据类型必须完美匹配才能使用,除非你进行了转换.
声明数组、循环、向数组添加项、使用 Postgres 函数返回数组、
您可以声明INTEGER数组而不是TEXT并避免强制转换(counter::TEXT)以及返回类型TEXT[]。(添加了那些以供参考。)
CREATE OR REPLACE FUNCTION "GetNumbers"(maxNo INTEGER) RETURNS TEXT[] AS $nums$
DECLARE
counter INTEGER := 0;
nums TEXT[] := ARRAY[]::TEXT[];
BEGIN
LOOP
EXIT WHEN counter = maxNo;
counter = counter + 1;
nums = array_append(nums, counter::TEXT);
END LOOP;
RETURN nums;
END ;
$nums$ LANGUAGE plpgsql;
SELECT "GetNumbers"(5); -- {1,2,3,4,5}
Run Code Online (Sandbox Code Playgroud)