PostgreSQL中的计算/计算列

PostgreSQL是否支持计算/计算列,如MS SQL Server? 我在文档中找不到任何内容,但由于此function包含在其他许多DBMS中,所以我想我可能会错过一些东西。

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

PostgreSQL本身不支持“Computed Columns”。

您可以使用视图实现类似的function。

或者你可以使用function,看起来就像计算列
这个相关答案的详细解释:

  • 将常用查询存储为列?

“持久”计算列可以用function相同的方式用触发器来实现。

物化视图是一个密切相关的概念。
Postgres 直接使用Postgres 9.3实现物化视图 。
在早期版本中,人们必须手动pipe理MV。

一个办法是用触发器!

CREATE TABLE computed( one SERIAL, two INT NOT NULL ); CREATE OR REPLACE FUNCTION computed_two_trg() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER AS $BODY$ BEGIN NEW.two = NEW.one * 2; RETURN NEW; END $BODY$; CREATE TRIGGER computed_500 BEFORE INSERT OR UPDATE ON computed FOR EACH ROW EXECUTE PROCEDURE computed_two_trg(); 

触发器在更新或插入行之前触发。 它改变了我们想要计算NEWlogging的字段,然后它返回那条logging。

是的你可以!! 解决scheme应该是简单,安全和高性能的…

我是新来的postgresql,但似乎你可以创build计算列通过使用expression式索引 ,配对视图 (该视图是可选的,但使生活更容易一些)。

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

 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); 

你可以用解释来检查这个。

然而在这一点上,你依靠表的用户知道如何构build列。 为了使生活更轻松,您可以在原始表格的扩充版本上创build一个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而不用担心它是如何工作的。他们只是获得良好的性能。 该视图不会复制原始表中的任何数据,因此它具有良好的内存和性能。 但是请注意,你不能更新/插入视图,只能到源表中,但如果你真的想,我相信你可以使用规则将插入和更新redirect到源表(作为最后一点,我可能是错的我从来没有尝试过自己)。

编辑:看起来如果查询涉及竞争索引,规划师引擎可能有时不会使用expression式索引。 这个select似乎与数据有关。

Check约束的轻量级解决scheme:

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