我正在使用带有PostGIS3.1扩展的PostgreSQL PostgreSQL 13.9来计算一个较大表格中的样本点之间的矢量.

如果我在下面的示例中使用点符号指定各个字段名称,则该函数可以正常工作:

CREATE OR REPLACE FUNCTION get_vectors() RETURNS void
AS $$
DECLARE points CURSOR FOR SELECT st_x(geom) as x, st_y(geom) as y, st_z(geom) as z FROM test_table ORDER BY id LIMIT 3;  
    p1 test_vectors%ROWTYPE;
    p3 test_vectors%ROWTYPE; 
    v1 test_vectors%ROWTYPE; 
BEGIN 
OPEN points; 
FETCH FIRST FROM points INTO p1; 
FETCH NEXT FROM points INTO p3;
v1.x := p3.x - p1.x;
DELETE FROM test_vectors;
INSERT INTO test_vectors VALUES (v1.*);
CLOSE points; 
END; 
$$ LANGUAGE plpgsql;

SELECT get_vectors();

SELECT * FROM test_vectors ;

百人表如下所示:

x y z
-0.0940000000409782 [null] [null]

但是,如果我将减法替换为v1 := p3 - p1;以在行级别进行操作,我会得到一个错误,显示为ERROR: operator does not exist: test_vectors - test_vectors.

让我困惑的是,当使用窗口函数,如领先或滞后时,允许减go 一行(例如https://dba.stackexchange.com/questions/300023/postgresql-subtract-to-each-row-the-previous-row). 为什么这在声明了ROWTYPE的函数中不起作用?

推荐答案

在本例中,您链接的lag()lead()从另一行(而不是整个另一行)获取特定的numeric类型的字段.这就是直接对这些函数的输出进行减法的原因.在documentation中,您可以看到,从另一行 Select 您想要获得的value不是可选的(不同于方括号):

lead ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

返回在分区内当前行之后offset行计算的值;如果没有这样的行,则返回default(其类型必须与value兼容).offsetdefault都是相对于当前行进行计算的.如果省略,则offset默认为1,default默认为NULL.

在这种情况下,从另一行检索的值是PostgreSQL已知的内置数字类型,并且它有一个内置函数来定义如何处理该类型的减法.

在您的例子中,test_vectors是您自己的、定制的、用户定义的表,所以PostgreSQL无法知道减go 它的整个行意味着什么,除非您定义了function个接受该表的记录,然后定义一个减法operator -,当它检测到这两个记录都是test_vectors类型时,它会将该函数应用到它的Left和Right参数上.

您也可以从定义custom type开始,然后定义create table your_table of your_custom_type;,以此类推.

Postgresql相关问答推荐

在同一 Select 列表中两次使用jsonb_arrayElements()是否安全?

无法在kubernetes中设置postgres复制

Postgres如何插入带有十进制逗号的实数?

PG 16 的 AGE 安装抛出错误:无法创建 src/backend/parser/ag_scanner.c

使用来自 docker 图像的 postgres 设置 Keycloak 21

气流数据库如何定期管理?

如何在 PostgreSQL 的回归测试中测试 TYPE 发送和接收函数

postgresql 更新错误ERROR: invalid input syntax for type boolean:

postgreSQL 中对 utf-8 的 LC_COLLATE 和 LC_CTYPE 支持

Nodemon - 安装期间clean exit - waiting for changes before restart

如何检索 PostgreSQL 数据库的 comments ?

在远程机器上Restore dump

PostgreSQL如何连接间隔值'2天'

如何判断每个组中是否存在值

SQL - 提示引用列

与 Oracle 的 CONNECT BY ... START WITH 等效的 PostgreSQL 语法是什么?

解释结果中的Recheck Cond是什么意思?

如何使用 sql 或 phpPgAdmin 更改 PostgreSQL 数据库的数据库编码?

PostgreSQL:从转储中恢复数据库 - 语法错误

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?