postgresql - update语句 - psql命令




PostgreSQL中的计算/计算列 (4)

PostgreSQL 本身至少支持Postgres 11不支持“Computed Columns”。

请参阅f90t关于正在开发的功能的评论 ,但它似乎不会出现在Postgres 11中

您可以使用view实现类似的功能。

或者您可以使用有效的函数,看起来就像计算列一样
这个相关答案的详细解释:

“持久”计算列可以用功能相同的方式用triggers实现。

物化视图是一个密切相关的概念, 自Postgres 9.3以来实施
在早期版本中,可以手动管理MV。

PostgreSQL是否支持计算/计算列,如MS SQL Server? 我在文档中找不到任何内容,但由于此功能包含在许多其他DBMS中,我认为我可能会遗漏某些内容。

例如: http://msdn.microsoft.com/en-us/library/ms191250.aspxhttp://msdn.microsoft.com/en-us/library/ms191250.aspx


是的你可以!! 解决方案应该简单,安全,高效......

我是postgresql的新手,但似乎你可以通过使用表达式索引创建计算列,与view配对(视图是可选的,但会使生活变得更容易)。

假设我的计算是md5(some_string_field) ,那么我创建索引为:

CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));

现在,任何作用于MD5(some_string_field)查询都将使用索引而不是从头开始计算。 例如:

SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);

您可以通过explain来查看。

但是,此时您依赖于表的用户知道如何构造列。 为了简化生活,您可以在原始表的增强版本上创建VIEW ,将计算值添加为新列:

CREATE VIEW some_table_augmented AS 
   SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;

现在任何使用some_table_augmented查询都可以使用some_string_field_md5而不用担心它是如何工作的......它们只是获得了良好的性能。 视图不会复制原始表中的任何数据,因此它在内存方面和性能方面都很好。 但请注意,您无法更新/插入视图,只能进入源表,但如果您真的需要,我相信您可以使用rules将插入和更新重定向到源表(我可能在最后一点上错了我自己从未尝试过)。

编辑:似乎查询涉及竞争索引,计划程序引擎有时可能根本不使用表达式索引。 选择似乎取决于数据。


具有Check约束的轻量级解决方案:

CREATE TABLE example (
    discriminator INTEGER DEFAULT 0 NOT NULL CHECK (discriminator = 0)
);

我有一个代码可以工作并使用计算的术语,我不是在postgresSQL纯我们在PADB上运行

这是它的使用方式

create table some_table as
    select  category, 
            txn_type,
            indiv_id, 
            accum_trip_flag,
            max(first_true_origin) as true_origin,
            max(first_true_dest ) as true_destination,
            max(id) as id,
            count(id) as tkts_cnt,
            (case when calculated tkts_cnt=1 then 1 else 0 end) as one_way
    from some_rando_table
    group by 1,2,3,4    ;






sql-view