我使用PostgreSQL 9.1.2,我有一个基本表,如下所示,其中我将条目的生存状态作为布尔值(Survival),也以天数(Survival(Days))表示。
我手动添加了一个名为1-yr Survival的新列,现在我想根据该条目的Survival和Survival (Days)列值为表中的每个条目填充列的值。一旦完成,数据库表将如下所示:
Survival Survival(Days) 1-yr Survival
---------- -------------- -------------
Dead 200 NO
Alive - YES
Dead 1200 YES输入1-yr Survival条件化值的伪代码如下所示:
ALTER TABLE mytable ADD COLUMN "1-yr Survival" text
for each row
if ("Survival" = Dead & "Survival(Days)" < 365) then Update "1-yr Survival" = NO
else Update "1-yr Survival" = YES
end 我相信这是一个基本的操作,但是我没有找到执行它的postgresql语法。一些搜索结果返回“添加触发器”,但我不确定这是我需要的。我想我这里的情况要简单得多。任何帮助/建议都将不胜感激。
发布于 2012-08-30 03:10:13
可以使用普通的UPDATE来实现一次性操作
UPDATE tbl
SET one_year_survival = (survival OR survival_days >= 365);我建议不要在您的名字中使用驼峰大小写、空格和括号。虽然允许在双引号之间使用,但这通常会导致复杂和混乱。考虑一下about identifiers and key words in the manual一章。
您是否知道可以使用COPY将查询结果导出为CSV
示例:
COPY (SELECT *, (survival OR survival_days >= 365) AS one_year_survival FROM tbl)
TO '/path/to/file.csv';这样一开始,您就不需要冗余列了。
对评论的补充回答
要避免空更新,请执行以下操作:
UPDATE tbl
SET "Dead after 1-yr" = (dead AND my_survival_col < 365)
,"Dead after 2-yrs" = (dead AND my_survival_col < 730)
....
WHERE "Dead after 1-yr" IS DISTINCT FROM (dead AND my_survival_col < 365)
OR "Dead after 2-yrs" IS DISTINCT FROM (dead AND my_survival_col < 730)
...就我个人而言,如果我有令人信服的理由,我只会添加这些多余的列。通常我不会。如果是关于性能的:你知道indexes on expressions and partial indexes吗?
发布于 2012-08-30 08:49:36
老实说,我认为你最好不要将数据存储在数据库中,因为数据库可以快速、轻松地从存储的数据中计算出来。一个更好的选择是模拟一个计算字段(如下所述)。在这种情况下,您将9将空格等更改为下划线,以便于维护:
CREATE FUNCTION one_yr_survival(mytable)
RETURNS BOOL
IMMUTABLE
LANGUAGE SQL AS $$
select $1.survival OR $1.survival_days >= 365;
$$;然后,您实际上可以:
SELECT *, m.one_year_survival from mytable m;而且它会“正常工作”。请注意以下陷阱:
缺省列列表不会返回
,因此
然而,好处是可以证明该值永远不会与其他值不同步。否则,您最终会得到一个检查约束的rats巢。
实际上,您可以将此方法带到更远的地方。请参阅http://ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-2-intro-to.html
https://stackoverflow.com/questions/12184409
复制相似问题