【发布时间】:2014-10-06 14:54:12
【问题描述】:
我想要一个PostgreSQL扩展函数,它可以首先检查表face_area(face int, area float)中是否有一行,如果没有,计算并插入表中。返回应该是区域(float),输入应该是面(int)。我在下面写了一个函数,但是结果只能是setof float,如何修改函数让返回的结果只是一个float?
CREATE FUNCTION get_area (face integer) RETURNS setof float AS $$
BEGIN
RETURN query SELECT area FROM face_area WHERE face_area.face=$1;
IF NOT FOUND THEN
INSERT INTO face_area VALUES ($1,calc_area($1));
END IF;
END;
$$ LANGUAGE plpgsql;
select get_area(1);
select * from face_area;
【问题讨论】:
-
你能澄清一下 WHERE 子句吗?您将 face_area 描述为 (id int, area float) 但使用列“face”...?
-
@AndrewWolfe 我已经修改过了。
-
另外,为什么 SETOF 浮动?为什么需要返回查询结果?
-
@AndrewWolfe 我需要返回 area=get_area(face) 以便在另一个查询中我可以使用 WHERE get_area(face)>5;所以,我不想要 setof float ,我只想浮动。但我不知道如何修改查询...
-
这可以通过一条语句完成:
insert into face_area (face, area) select 42, calc_area(42) where not exists (select 1 from face_area where face = 42) returning face_area.area。你也不应该使用float:floating-point-gui.de
标签: postgresql