在 Postgres 游标中从一行变量中减去另一行变量

问题描述 投票:0回答:1

我正在使用 PostgreSQL PostgreSQL 13.9 和 PostGIS 3.1 扩展来计算较大表中点样本之间的向量。

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

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 ;

test_vectors
表格看起来像:

x y z
-0.0940000000409782 [空] [空]

但是,如果我将减法替换为

v1 := p3 - p1;
以在行级别进行操作,则会收到错误消息
ERROR:  operator does not exist: test_vectors - test_vectors

令我困惑的是,当使用 LEAD 或 LAG 等窗口函数时,允许减去一行(例如 https://dba.stackexchange.com/questions/300023/postgresql-subtract-to-each-row-the -上一行)。 为什么这在声明了 ROWTYPE 的函数中不起作用?

postgresql postgis
1个回答
0
投票

在示例中,您链接

lag()
lead()
从另一行而不是整个另一行获取特定的
numeric
类型字段。这就是可以直接对这些输出进行减法的原因。

test_vectors
是您自己的、自定义的、用户定义的表,因此 PostgreSQL 无法知道减去其条目意味着什么,除非您定义一个接受该表记录的函数,然后进行减法运算符
-
当检测到左右参数均为
test_vectors
类型时,将该函数应用于其左右参数。

您还可以从定义自定义类型开始,然后定义

create table your_table of your_custom_type;
等等。

© www.soinside.com 2019 - 2024. All rights reserved.