Man*_*ngo 19 postgresql computed-column
PostgreSQL 是否支持生成的列?也称为虚拟列。我不是在谈论IDENTITY
列。
我找不到有关此卓越功能的任何信息,但我知道它在 SQL Server 以及最新版本的 MariaDB 和 MySQL 中可用。
SQL:2003标准中提到了该功能,并且在 2006 年左右在 PostgreSQL 论坛上进行了一些讨论,但我找不到关于此事的任何实质性内容。
有一些关于 SO 的讨论,但它现在已经很老了,所以它很可能已经过时了。
小智 22
不确定这是否是您想要的,但属性表示法row.full_name
和函数表示法full_name(row)
在 postgresql 中是等效的。
这意味着你要一张桌子
CREATE TABLE people (
first_name text,
last_name text
);
Run Code Online (Sandbox Code Playgroud)
和一个功能:
CREATE FUNCTION full_name(people) RETURNS text AS $$
SELECT $1.first_name || ' ' || $1.last_name;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
并这样称呼它:
select full_name from people
Run Code Online (Sandbox Code Playgroud)
那是你需要的吗?
为了加快速度,您可以创建一个表达式索引:
CREATE INDEX people_full_name_idx ON people
USING GIN (to_tsvector('english', full_name(people)));
Run Code Online (Sandbox Code Playgroud)
或者将所有内容存储在物化视图中。
示例取自此处:http : //bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
不,目前(从 Postgres 9.6 开始)不支持此功能。
如果是不需要索引的简单计算,唯一的解决方法是使用触发器或视图。
GENERATED ALWAYS AS … STORED
Postgres 12添加了生成列的功能,如SQL:2003标准中所述。
该值在INSERT
or时生成UPDATE
,然后像任何其他值一样与行一起存储。
生成的必须基于同一个表的基列,或基于不可变函数。
语法很简单,一个子句CREATE TABLE
:
GENERATED ALWAYS AS ( generation_expr ) STORED
Run Code Online (Sandbox Code Playgroud)
例子:
CREATE TABLE people (
...,
height_cm NUMERIC,
height_in NUMERIC GENERATED ALWAYS AS ( height_cm / 2.54 ) STORED
);
Run Code Online (Sandbox Code Playgroud)
特征:
注意事项:
看:
归档时间: |
|
查看次数: |
13288 次 |
最近记录: |