Postgresql 如何在postgres中弹出数组?

Postgresql 如何在postgres中弹出数组?,postgresql,plpgsql,Postgresql,Plpgsql,我想知道如何使用plpgsql从postgresql中的数组顶部弹出一个值 CREATE FUNCTION pop_off(arr ANYARRAY) RETURNING ANYARRAY AS $$ BEGIN -- return array with first element removed END; $$ LANGUAGE plpgsql; 嗯,这并不像我想的那么难。让我们利用数组长度方法 CREATE OR REPLACE FUNCTION pop_o

我想知道如何使用plpgsql从postgresql中的数组顶部弹出一个值

CREATE FUNCTION pop_off(arr ANYARRAY) RETURNING ANYARRAY AS $$
    BEGIN
        -- return array with first element removed
    END;
$$ LANGUAGE plpgsql;

嗯,这并不像我想的那么难。让我们利用数组长度方法

CREATE OR REPLACE FUNCTION pop_off(arr ANYARRAY) RETURNS ANYARRAY AS $$
    BEGIN
        RETURN (SELECT arr[2:array_length(arr,1)]);
    END;
$$ LANGUAGE plpgsql;
好了!现在让我们测试一下

LOG:  statement: CREATE OR REPLACE FUNCTION pop_off(arr ANYARRAY) RETURNS ANYARRAY AS $$
    BEGIN
        RETURN (SELECT arr[2:array_length(arr,1)]);
    END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
test_database=# SELECT pop_off('{1,2,3}'::int[]);
LOG:  statement: SELECT pop_off('{1,2,3}'::int[]);
 pop_off 
--------- 
{2,3}
(1 row)

这会起作用,但性能会很差。您不是在原地修改数组,而是每次分配一个新数组。如果有机会,我倾向于用C语言做这类事情,将数组和偏移量传递给函数,或者避免反复重新构造数组。非常好的建议。似乎是一个足够简单的C函数。。麻烦你给我们一个回信好吗?我已经有很长时间没有成功地使用指针表示法了:)啊,你还没有享受到使用PostgreSQL的数组API的乐趣吗?我做堆栈溢出是为了好玩和学习,而在C中使用Pg的数组在第1部分中非常失败;-)。我一直在为core开发一个
array\u find
函数,这已经足够C API数组工作一段时间了。在PL/PgSQL中传递数组和一个“当前索引”值是很合理的,因为数组是通过引用而不是值传递的,所以不需要在C中这样做。只有当您开始实际修改数组时,PL/PgSQL中的性能才会变得糟糕。Eek。。。听起来我应该重新调整阵列的需求。。谢谢,克雷格。如果你喜欢恐怖片,你可能会对我最后一次在pg.中使用C函数失败的尝试微笑。。您可以直接使用纯SQL,并且
不可变
。。。为了更好的表现<代码>创建函数pop_off(ANYARRAY)将ANYARRAY作为$$SELECT$1[2:array_length($1,1)];$$返回语言sql不可变