如何通过INT id从PostgreSQL函数返回值数组

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是唯一且整数.

Ham*_*one 6

根据文档:

允许具有固定返回类型的多态参数,但反之则不然.

因此,我认为你的回归尝试是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)

我认为数据类型必须完美匹配才能使用,除非你进行了转换.


Thu*_*ika 6

声明数组、循环、向数组添加项、使用 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)

  • 该脚本不起作用。这是更新版本。`创建或替换函数 get_numbers(maxNo INTEGER) 返回 TEXT[] AS $$ 声明计数器 INTEGER := 0; nums TEXT[] := ARRAY[]::TEXT[]; 当计数器 = maxNo 时开始循环退出;计数器 = 计数器 + 1;nums = array_append(nums, counter::TEXT); 结束循环;返回数字;结尾 ; $$ 语言 plpgsql;` (2认同)
  • 谢谢尼克,我更新了功能。现在是正确的了。 (2认同)