Postgres建表时如何设置空列为带时区的timestamp类型
错误原因
你在CREATE TABLE AS SELECT(简称CTAS)语句中使用了仅ALTER TABLE修改列类型场景支持的TYPE ... USING语法,不属于SELECT子句的合法语法,因此触发语法报错。
正确实现方案
你只需要在SELECT子句中直接将空值显式转换为TIMESTAMP WITH TIME ZONE类型,再指定别名即可,不需要额外的TYPE声明:
- 不要用字符串空值
''来生成时间戳类型的空值,直接用NULL显式强转即可保证数据类型符合要求。 - 不同SQL语法环境可以选择对应写法:
-- PostgreSQL方言写法 NULL::TIMESTAMP WITH TIME ZONE AS decay_date_lfd -- 通用SQL标准写法 CAST(NULL AS TIMESTAMP WITH TIME ZONE) AS decay_date_lfd
修正后的完整SQL(兼容通用标准)如下:
CREATE TABLE my_schema.final_summed_table AS SELECT 'Unstudied' AS table_name, r.region, r.state, r.co_fips, c.co_name AS county, 'TIER 0' AS tiermetric_lfd, 'UNASSESSED' AS val_combine_lfd, 'Unmapped' AS mod_unmod_lfd, '' AS det_approx_lfd, CAST(NULL AS TIMESTAMP WITH TIME ZONE) AS decay_date_lfd FROM my_schema.unmapped r, cnms.counties c WHERE r.co_fips = c.co_fips
后续UNION操作注意事项
执行UNION前需要确保两张表的对应列满足以下要求,即可正常执行操作:
- 列数量完全一致
- 相同顺序位置的列数据类型完全匹配
内容的提问来源于stack exchange,提问作者gwydion93
相关产品推荐
相关产品推荐

