标签: generated-columns

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

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

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

postgresql materialized-views calculated-columns sql-view generated-columns

92
推荐指数
4
解决办法
8万
查看次数

Postgres:如何在生成的列中包含权重?

我有以下架构:

\n
CREATE TABLE books (\n  title VARCHAR(255),\n  subtitle TEXT\n);\n
Run Code Online (Sandbox Code Playgroud)\n

添加没有权重的生成列工作正常:

\n
ALTER TABLE books ADD COLUMN full_text_search TSVECTOR\n  GENERATED ALWAYS AS (to_tsvector(\'english\',\n    coalesce(title, \'\') ||\' \'||\n    coalesce(subtitle, \'\')\n  )) STORED; -- \xe2\x9c\x85 Working\n
Run Code Online (Sandbox Code Playgroud)\n

现在我想添加权重但不起作用:

\n
ALTER TABLE books ADD COLUMN full_text_search_weighted TSVECTOR\n  GENERATED ALWAYS AS (to_tsvector(\'english\',\n    setweight(coalesce(title, \'\'), \'A\') ||\' \'||\n    setweight(coalesce(subtitle, \'\'), \'B\')\n  )) STORED; -- \xe2\x9d\x8c Not working\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法在 postgres 中生成的列中包含权重?

\n

复制链接:https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/1385

\n

postgresql tsvector weighted generated-columns

3
推荐指数
1
解决办法
977
查看次数

Postgres 生成的列不是不可变的

我正在向表中添加一些列,并且想要一个将它们组合在一起的生成列,我将使用它作为唯一索引。当我尝试添加列时,出现错误ERROR: generation expression is not immutable

我遵循了这个问题的解决方案,并且专门使用CASE||进行字符串连接,这应该是immutable.

ALTER TABLE tag
  ADD COLUMN prefix VARCHAR(4) NOT NULL,
  ADD COLUMN middle BIGINT NOT NULL,
  ADD COLUMN postfix VARCHAR(4), -- nullable
  -- VARCHAR size is 4 prefix + 19 middle + 4 postfix + 2 delimiter
  ADD COLUMN tag_id VARCHAR(29) NOT NULL GENERATED ALWAYS AS
    (CASE WHEN postfix IS NULL THEN prefix || '-' || middle
          ELSE prefix || '-' || middle || '-' …
Run Code Online (Sandbox Code Playgroud)

postgresql generated-columns postgresql-14

3
推荐指数
1
解决办法
615
查看次数

使用给定模式在 Postgres 中生成列

我需要生成一个 SQL 查询,它可以生成遵循某种模式的列

模式是这样存储的Hello [Name] [lastname]

其中namelastname都是表中的列。

如何在 end、start 和 ind Between 属性处添加常量字符串?

以及如何区分表列和我添加的列应包含的字符串?

我的查询目前看起来像这样 - 然后模式

ALTER TABLE IF public.nameRegistration
DROP COLUMN IF EXISTS generated_colum 
ADD COLUMN generated_colum TEXT generated ALWAYS as (|Pattern|) stored; 
Run Code Online (Sandbox Code Playgroud)

模式只是Hello Name lastname

sql string postgresql alter-table generated-columns

2
推荐指数
1
解决办法
506
查看次数

PostgreSQL 是否只支持 STORED 生成的列?

前言

我已经给出了一些来自 PHP 的例子,只是为了指出我的开发环境。问题不是关于 PHP,而是纯粹关于 PostgreSQL。


关于生成列的PostgreSQL文档指出:

生成的列有两种:存储的和虚拟的。存储的生成列在写入(插入或更新)时进行计算,并像普通列一样占用存储空间。虚拟生成列不占用存储空间,读取时进行计算。

但是,它只显示了该页面示例中存储列的示例,而不是虚拟列。它还说:

必须指定关键字 STORED 来选择生成列的存储类型。有关更多详细信息,请参阅创建表。

...链接到CREATE TABLE 页面的地方。在该页面中,文档明确指出模式是GENERATED ALWAYS AS (expression) STORED.

GENERATED ALWAYS AS ( generation_expr ) 存储

此子句将列创建为生成的列。该列无法写入,读取时将返回指定表达式的结果。

需要关键字 STORED 来表示该列将在写入时计算并将存储在磁盘上。

生成表达式可以引用表中的其他列,但不能引用其他生成的列。使用的任何函数和运算符都必须是不可变的。不允许引用其他表。

我实际上尝试在 Laravel (PHP) 中实现一个虚拟字段,这是我迄今为止在迁移中想到的:

DB::statement('ALTER TABLE entries ADD COLUMN do_hint BOOLEAN GENERATED ALWAYS AS (hint_hash OR hint_tags OR hint_due_date OR hint_created_at OR hint_updated_at) VIRTUAL');
Run Code Online (Sandbox Code Playgroud)

正如您在此语句中所见,表中有hint_hash,hint_tags和其他几个布尔列(以hint_*glob 模式命名)entries。我想计算do_hint即时,以便:

  • 我实际上可以从数据库中查询它。当然,我也可以在 PHP 上生成它,但我想查询,这就是我想使用虚拟列的一点。
  • 我想依靠 …

sql postgresql create-table generated-columns

0
推荐指数
1
解决办法
792
查看次数

存储/虚拟生成的列 - 优点/缺点/最佳实践?

我已经阅读了有关它们的 MySQL 文档,但仍然不清楚存储/虚拟生成列的好处?将相同的数据存储在实际列中并将其索引到内存中有何优点/缺点?有哪些优点/缺点,以及使用它们更有效或更好的最佳时间/示例?谢谢你!

mysql generated-columns

0
推荐指数
1
解决办法
2854
查看次数