PostgreSQL是否支持计算/计算列,如MS SQL Server?我在文档中找不到任何内容,但由于此功能包含在许多其他DBMS中,我认为我可能会遗漏某些内容.
postgresql materialized-views calculated-columns sql-view generated-columns
使用PostgreSQL,我有很多查询,如下所示:
SELECT <col 1>, <col 2>
, (SELECT sum(<col x>)
FROM <otherTable>
WHERE <other table foreignkeyCol>=<this table keycol>) AS <col 3>
FROM <tbl>
Run Code Online (Sandbox Code Playgroud)
鉴于子选择在每种情况下都是相同的,有没有办法将该子选择存储为表中的伪列?基本上,我希望能够从表A中选择一列,它是表B中与记录相关的特定列的总和.这可能吗?
在PostgreSQL中,我想使用SQL语句组合两列并从中创建一个新列.
我正在考虑使用concat(...),但有更好的方法吗?
最好的方法是什么?
根据Postgres文档,它们支持3种数据类型的字符数据:
Run Code Online (Sandbox Code Playgroud)character varying(n), varchar(n) variable-length with limit character(n), char(n) fixed-length, blank padded text variable unlimited length
在我的应用程序中,我遇到了一些令人不愉快的情况,其中插入/更新查询失败,因为要插入的所需文本超出varchar(n)或char(n)限制.
对于这种情况,更改此类列的数据类型就text足够了.
我的问题是:
如果我们概括并更改每个字符存储列的数据类型text,那么性能/内存方面是否有任何缺点?
如果数据类型的列text每次都存储10个或更少的字符,我应该选择text还是varchar(10)?
如果我追求的text是什么?
这篇博文展示了如何immutable_concat在 Pg 中创建函数的示例:
CREATE OR REPLACE FUNCTION immutable_concat(VARIADIC "any")
RETURNS text AS 'text_concat'
LANGUAGE internal IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
我想做同样的事情concat_ws并且相应的text_concat_ws确实存在,但是,以下只会使过程崩溃:
CREATE OR REPLACE FUNCTION immutable_concat_ws(VARIADIC "any")
RETURNS text AS 'text_concat_ws'
LANGUAGE internal IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
更新: 的 siguatureimmutable_concat_ws应该是(glue, *parts),一个胶水(text 或 varchar)和一个或多个部分(text、varchar 或 null)。
我在这里缺少什么?
我正在向表中添加一些列,并且想要一个将它们组合在一起的生成列,我将使用它作为唯一索引。当我尝试添加列时,出现错误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)