PostgreSQL 9.5 更新视图中的虚拟列
PostgreSQL 9.5 Update virtual column in view
我将 PostgreSQL 与 PostGIS 和 QGIS 一起用于 GIS,但我想我可能会在这里找到比 gis.stackexchange.com 更多的信息,因为我的问题与 GIS 没有直接关系。
我正在使用视图来根据用户的特定需求随意显示数据,就像他们可以访问数据库中的数据一样,但只是他们需要的。我在我的视图中添加了一些规则,使它们在 QGIS 中成为 "updatable",并由用户直接使它们成为 "workable"。
QGIS中的显示是以属性为基础的,但由于不同的人可能会在同一时刻访问相同的数据,他们可能希望根据自己的需要显示和隐藏其中的一些数据(地图打印一次)。所以我正在寻找一种方法来为每个视图提供特定的显示,我想在视图定义中简单地添加一个 "virtual" 列,例如像这样的布尔值:
CREATE VIEW view1 AS
SELECT oid, column1, True as display from table1;
但我希望我的用户能够更改此列的值,以便简单地使 canvas 中的对象出现或消失(考虑到此参数,使用基于规则的样式)。显然它不能直接工作,因为更新会与视图的定义冲突。
有人知道如何实现吗?也许是物化视图(但我很喜欢常规视图的动态)?
谢谢。
如果唯一 ID 字段是从 table 中读取的(即它不是通过 QGIS 中常用于空间视图的 row_number() 技巧动态创建的),您可以创建可见性manager table 并在视图中使用它。您可以有一个 table 按视图或一个用于所有视图。类似于:
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
我将 PostgreSQL 与 PostGIS 和 QGIS 一起用于 GIS,但我想我可能会在这里找到比 gis.stackexchange.com 更多的信息,因为我的问题与 GIS 没有直接关系。
我正在使用视图来根据用户的特定需求随意显示数据,就像他们可以访问数据库中的数据一样,但只是他们需要的。我在我的视图中添加了一些规则,使它们在 QGIS 中成为 "updatable",并由用户直接使它们成为 "workable"。
QGIS中的显示是以属性为基础的,但由于不同的人可能会在同一时刻访问相同的数据,他们可能希望根据自己的需要显示和隐藏其中的一些数据(地图打印一次)。所以我正在寻找一种方法来为每个视图提供特定的显示,我想在视图定义中简单地添加一个 "virtual" 列,例如像这样的布尔值:
CREATE VIEW view1 AS
SELECT oid, column1, True as display from table1;
但我希望我的用户能够更改此列的值,以便简单地使 canvas 中的对象出现或消失(考虑到此参数,使用基于规则的样式)。显然它不能直接工作,因为更新会与视图的定义冲突。
有人知道如何实现吗?也许是物化视图(但我很喜欢常规视图的动态)?
谢谢。
如果唯一 ID 字段是从 table 中读取的(即它不是通过 QGIS 中常用于空间视图的 row_number() 技巧动态创建的),您可以创建可见性manager table 并在视图中使用它。您可以有一个 table 按视图或一个用于所有视图。类似于:
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