PostgreSQL 9.5更新视图中的虚拟列

时间:2017-06-08 07:15:50

标签: postgresql postgis qgis sql-view

我正在使用PostgreSQL与PostGIS和QGIS进行GIS用途,但我想我可能会在gis.stackexchange.com找到更多信息,因为我的问题与GIS没有直接关系。

我正在使用视图来随意显示数据,以满足用户的特定需求,例如他们可以访问数据库中的数据,但只需要他们需要的数据。我在视图中添加了一些规则,使它们在QGIS中“可更新”,并使用户直接“可操作”。

QGIS中的显示基于属性,但由于不同的人可能会在同一时刻访问相同的数据,他们可能希望根据需要显示和隐藏其中一些数据(地图打印为一旦)。所以我正在寻找一种方法来为每个视图提供特定的显示,我想在视图定义中添加一个“虚拟”列,例如像这样的布尔值:

CREATE VIEW view1 AS
SELECT oid, column1, True as display from table1;

但我希望我的用户能够更改此列的值,只是简单地从画布中显示或消除对象(考虑此参数时使用基于格式的样式)。显然它不起作用,因为更新会与视图的定义冲突。

有没有人知道如何实现这一目标?也许是物化视图(但我非常喜欢常规视图的动态)?

感谢。

1 个答案:

答案 0 :(得分:1)

如果从表中读取唯一ID字段(即,它不是通过QGIS中常用于空间视图的row_number()技巧动态创建的),则可以创建可见性管理器表并在视图中使用它。您可以按视图查看一个表,或者为所有表创建一个表。类似于:

create table visibility_manager (oid bigint, visibility_status boolean, viewname text);


CREATE VIEW view1 AS
SELECT table1.oid, column1, coalesce(visibility_status,true) as display 
    from table1 
    left outer join visibility_manager 
    on (table1.oid = visibility_manager.oid and visibility_manager.viewname = 'view1');

看到它的实际效果: http://rextester.com/OZPN1777