【问题标题】:PostgreSQL 9.5 Update virtual column in viewPostgreSQL 9.5 更新视图中的虚拟列
【发布时间】:2017-06-08 07:15:50
【问题描述】:

我在 PostGIS 和 QGIS 中将 PostgreSQL 用于 GIS 目的,但我想我可能会在这里找到比 gis.stackexchange.com 更多的信息,因为我的问题与 GIS 没有直接关系。

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

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

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

但我希望我的用户能够更改此列的值,以简单地使画布上的对象出现或消失(考虑到此参数,使用基于规则的样式)。显然它不能直接工作,因为更新会与视图的定义相冲突。

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

谢谢。

【问题讨论】:

  • 为什么不使用真实的列代替?..在原始表中
  • @VaoTsun 因为我希望每个视图的属性都是特定的,并且一个对象可以在多个视图中(更改属性一次就是在每个视图中更改它)。

标签: postgresql postgis qgis sql-view


【解决方案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

【讨论】:

  • 嗯...我喜欢!谢谢你。马上测试。 :)
  • 测试,批准。再次感谢!
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多