PostgreSQL是否支持计算/计算列,如MS SQL Server?我在文档中找不到任何内容,但由于此功能包含在许多其他DBMS中,我认为我可能会遗漏某些内容.
postgresql materialized-views calculated-columns sql-view generated-columns
我想在我的表中创建一个新字段(或两个),这是其他字段的串联,这似乎相对简单.但是我用什么case语法或if/when语法来帮助创建以下字段(GPA_TXT,和newfield)?
逻辑是:每个GPA应该是#.#,每个新字段应该是:
name & "-" & GPA_TXT & (
case where GPA_TXT > 3.3
set newfield = newfield & 'GradeA',
case where GPA_TXT >2.7 and GPA_TXT < 3.3
set newfield = newfield & "GradeB",
etc...
)
Run Code Online (Sandbox Code Playgroud)
例如:
name major GPA(num) GPA_TXT [newfield]
Bob sci 2 02.0 Bob-sci-GradeC-02.0
Jane chem 3.1 03.1 Jane-chem-GradeB-03.1
Charlie phys 3.7 03.7 Charlie-phys-GradeA-03.7
Garfield food 0 00.0 Garfield-food-GradeF-00.0
Run Code Online (Sandbox Code Playgroud)
所以我想我在这里有两个问题:
如果有人可以通过示例或解释将我链接到资源,我会非常感激!我正在查看文档,但没有示例,没有任何地方.
我有一张桌子:
CREATE TABLE annotations
(
gid serial NOT NULL,
annotation character varying(250),
the_geom geometry,
"rotationAngle" character varying(3) DEFAULT 0,
CONSTRAINT annotations_pkey PRIMARY KEY (gid),
CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),
CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)
)
Run Code Online (Sandbox Code Playgroud)
并触发:
CREATE TRIGGER set_angle
AFTER INSERT OR UPDATE
ON annotations
FOR EACH ROW
EXECUTE PROCEDURE setangle();
Run Code Online (Sandbox Code Playgroud)
功能:
CREATE OR REPLACE FUNCTION setAngle() RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
UPDATE annotations SET "rotationAngle" = degrees( ST_Azimuth( ST_StartPoint(NEW.the_geom), ST_EndPoint(NEW.the_geom) ) )-90 …Run Code Online (Sandbox Code Playgroud) CREATE TABLE my_app.person
(
person_id smallserial NOT NULL,
first_name character varying(50),
last_name character varying(50),
full_name character varying(100) generated always as (concat(first_name, ' ', last_name)) STORED,
birth_date date,
created_timestamp timestamp default current_timestamp,
PRIMARY KEY (person_id)
);
Run Code Online (Sandbox Code Playgroud)
Error: generation expression is not immutable
The goal is to populate the first name and last into the full name column.
sql postgresql database-design string-concatenation calculated-columns
假设我们有两个表:
contacts具有列的表:id和nameconversations具有列的表:id和contact_id(FK 到contacts.id)以下两个查询返回相同的数据:
SELECT contacts.name, contacts.id, conversations.id FROM contacts INNER JOIN conversations ON contacts.id = conversations.contact_id;
和
SELECT contacts.name, contacts.id, conversations.id FROM contacts INNER JOIN conversations ON id(contacts) = contact_id(conversations);
出于纯粹的理论原因,我想了解更多有关第二个(功能更强大)版本的信息。这种语法叫什么?我可以在哪里了解更多信息?这是 SQL 标准中的语法还是 PostgreSQL 中的语法?性能好吗?为什么它没有得到更广泛的应用?
因此,当我意外地提到我的CTE中不存在的"计数"列时,我遇到了我认为是一个奇怪的错误.Postgres正在寻找GROUP BY子句,即使我不认为我在做聚合.多一点玩,看起来table.count相当于一个计数星函数.考虑以下:
SELECT
c.clinic_id,
c.count,
count(*) as count_star
FROM clinic_member c
GROUP BY
c.clinic_id
ORDER BY clinic_id;
Run Code Online (Sandbox Code Playgroud)
这将在我的数据集中生成如下所示的结果:
有兴趣了解Postgres的实际语法规则是什么,我尝试在文档中搜索对此语法的引用,但无法找到任何内容; 只有很多计数(*)的文档.任何人都可以解释这是否是有效的SQL以及是否还有其他聚合函数也可以类似地调用?Postgres文档的链接如果存在则会很棒.
注意.这是Postgres 9.5.9