【问题标题】:Postgres function to return an int arrayPostgres函数返回一个int数组
【发布时间】:2020-01-21 21:25:37
【问题描述】:

我正在涉足 Postgres 存储过程/函数的世界,但遇到了一些刚起步的困难。按照我遇到的文档和各种示例,我编写了函数

CREATE FUNCTION array_intersect(a INT[],b INT[]) RETURNS INT[] AS $$
BEGIN
 DECLARE result INT[];
 SELECT INTO result ARRAY(
 SELECT UNNEST($1) INTERSECT  SELECT UNNEST($2)
 return result;
END; $$ 
LANGUAGE plpgsql; 

只看到诸如

之类的错误

查询错误:错误:“INTO”处或附近的语法错误 第 4 行:选择结果数组( 上下文:无效的类型名称“INTO 结果数组( 选择未嵌套($1) 相交选择未嵌套($2) 返回结果”

我显然在这里做错了什么,但我看不出它可能是什么。据我所知,我有

  • 在函数中正确声明了两个参数及其类型
  • 表示该函数应返回一个 int 数组作为其结果
  • 声明了一个变量来保存结果
  • 用选择填充它
  • 返回结果

我发现 Postgres 函数语法相当晦涩,但也许这取决于我的新手感知。我怎样才能正确使用这种语法?

【问题讨论】:

    标签: postgresql function stored-procedures


    【解决方案1】:

    你有一个不平衡的括号。

    我假设你正在寻找

    CREATE OR REPLACE FUNCTION array_intersect(int[], int[]) RETURNS int[]
    LANGUAGE sql IMMUTABLE STRICT AS
    'SELECT array_agg(a) FROM ((SELECT unnest($1) AS x) INTERSECT 
     (SELECT unnest($2) AS y)) AS a(a)';
    

    【讨论】:

    • 我最终使用了CREATE OR REPLACE FUNCTION array_intersect(BIGINT[],BIGINT[]) RETURNS BIGINT[] LANGUAGE sql AS 'SELECT ARRAY(SELECT UNNEST($1) INTERSECT SELECT UNNEST($2));';
    【解决方案2】:

    您的 PL/pgSQL 结构中有几个错误:

    DECLAREneeds to be before 第一个 BEGIN。

    INTO 部分将查询结果存储到 SELECT 列表中的变量 goes after 中。

    不是报错,但是不需要按位置引用参数:

    CREATE FUNCTION array_intersect(a INT[],b INT[]) RETURNS INT[] 
    AS $$
    DECLARE 
      result INT[];
    
    BEGIN
      SELECT ARRAY(SELECT UNNEST(a) INTERSECT  SELECT UNNEST(b))
        into result;
    
      return result;
    
    END; $$ 
    LANGUAGE plpgsql; 
    

    但是像这样的短函数最好用language sql 编写(如 Laurenz 的回答所示),而不需要 PL/pgSQL。

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多