PostgreSQL如何将现有查询结果作为新列添加至表中?
给现有表添加计算生成的新列
你原来的写法问题在于ALTER TABLE ADD COLUMN不能直接嵌套SELECT子查询,要把现有字段的计算结果作为新列添加,有两种实用方案:
方案一:动态生成列(自动同步原字段变化)
如果希望新列的值随原字段(date、military_hour)的修改自动更新,可以用PostgreSQL的生成列语法,直接基于当前行的字段表达式计算,不需要查询整个表:
ALTER TABLE table_name1 ADD COLUMN datetime TIMESTAMP GENERATED ALWAYS AS ( -- 用lpad简化补0逻辑,替代原来的CASE判断 concat(date, ' ', lpad(military_hour::varchar, 2, '0'), ':00:00')::timestamp ) STORED;
GENERATED ALWAYS AS (...) STORED表示这个列的值由表达式计算并存储在表中,每次原字段变更时会自动刷新。
方案二:静态填充列(计算一次后固定值)
如果只需要一次性计算并填充新列,后续原字段变化不需要同步更新,就分两步操作:先添加空列,再用UPDATE语句填充值:
-- 第一步:添加空的timestamp列 ALTER TABLE table_name1 ADD COLUMN datetime TIMESTAMP; -- 第二步:计算并填充所有行的新列值 UPDATE table_name1 SET datetime = concat(date, ' ', lpad(military_hour::varchar, 2, '0'), ':00:00')::timestamp;
补充说明
原来的CASE判断可以用lpad函数简化,lpad(military_hour::varchar, 2, '0')会自动把小于10的数字补前导0,比如把5转成05,逻辑更简洁。
内容的提问来源于stack exchange,提问作者OranC
相关产品推荐
相关产品推荐

