为了账号安全,请及时绑定邮箱和手机立即绑定

请问PostgreSQL中的计算/虚拟/派生列

/ 猿问

请问PostgreSQL中的计算/虚拟/派生列

慕桂英546537 2019-10-22 17:12:55

PostgreSQL中的计算/虚拟/派生列

PostgreSQL是否支持计算/计算列,如MSSQLServer?我在文档中找不到任何东西,但是由于这个特性包含在许多其他DBMS中,我想我可能遗漏了一些东西。

例:http:/msdn.microsoft.com/en-us/Library/ms 191250.aspx


查看完整描述

3 回答

?
米脂

不超过Postgres 11生成列不支持-就像SQL标准中定义的那样,由一些RDBMS实现,包括DB2、MySQL和Oracle。也不像“计算列”SQL Server。

STORED生成的列与Postgres 12..微不足道的例子:

CREATE TABLE tbl (
  int1    int, int2    int, product bigint GENERATED ALWAYS AS (int1 * int2) STORED);

DB<>小提琴这里

VIRTUAL生成的列可能与下一次迭代一起出现。有关:

  • 函数调用的属性表示法产生错误

在那之前,你可以模仿VIRTUAL生成的列具有功能使用属性表示法 (tbl.col)看起来和工作方式类似于虚拟生成的列。..由于历史原因,这在Postgres中存在一些语法上的奇怪之处,正好适合这种情况。这个相关的答案代码示例:

  • 将公共查询存储为列?

表达式(看起来像列)不包括在SELECT * FROM tbl尽管如此。你总是必须明确地列出它。

也可以通过匹配来支持表达指数-只要职能是IMMUTABLE..比如:

CREATE FUNCTION col(tbl) ... AS ...  -- your computed expression hereCREATE INDEX ON tbl(col(tbl));

备选方案

或者,您可以使用VIEW,可选地与表达式索引耦合。然后SELECT *可以包括生成的列。

“坚持”(STORED)计算列可以用触发器以一种功能相同的方式。

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



查看完整回答
反对 回复 2019-10-23
?
MMMHUHU

一种方法是用扳机!

CREATE TABLE computed(
    one SERIAL,
    two INT NOT NULL);CREATE OR REPLACE FUNCTION computed_two_trg()RETURNS triggerLANGUAGE plpgsql
SECURITY DEFINERAS $BODY$BEGIN
    NEW.two = NEW.one * 2;

    RETURN NEW;END$BODY$;CREATE TRIGGER computed_500
BEFORE INSERT OR UPDATEON computedFOR EACH ROWEXECUTE PROCEDURE computed_two_trg();

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




查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信