PostgreSQL使用SELECT INTO插入同名列不同类型报重复列错误
问题根因
PostgreSQL 执行SELECT INTO创建新表时,要求返回结果集的平级列名称不能重复——同一张关系表不允许存在两个完全同名的平级字段,这是关系型数据库的通用底层硬约束,没有配置参数可以绕过。
当前语句中,原生日期类型的TE.createdate、经TO_CHAR转换后的字符串类型值被设置了相同的createdate别名,数据库无法区分两个平级重名列,直接抛出错误:
重复列:列"createdate"被多次指定
可行实现方案
首先明确:同一张表内不存在两个平级同名字段的实现可能。如果业务要求两个值对外呈现的字段名都为createdate,可以通过嵌套结构实现,让外层列名和嵌套结构内的字段名重名,不会触发重名校验。
修改后的可执行语句如下:
SELECT DISTINCT TE.id, T.debatchqueuelink, TE.transactionlink, EC.errorclassification, TE.errorvalue, EC.errorparameter, TE.classificationlink, TE.description, TE.createdate AS createdate, -- 将格式化后的日期字符串封装为JSON对象,内部key设为createdate jsonb_build_object('createdate', TO_CHAR(TE.createdate, 'MM/dd/yyyy')) AS createdate, TE.status, TE.rebutt, TE.rebuttedstatus, BQ.appbatchnumber, BQ.scanbatchnumber, BQ.clientlink, BQ.locationlink, T.patientid, (DEUD.firstname|| ' ' ||DEUD.lastname) AS deusername, DEUD.email AS deuseremail, (QCUD.firstname|| ' ' ||QCUD.lastname) AS qcusername, TE.inactive, TE.decomment INTO table373 FROM qctransactionerror TE INNER JOIN errorclassification EC ON EC.id = TE.classificationlink INNER JOIN qctransaction T ON T.id = TE.transactionlink INNER JOIN batchqueue BQ ON T.debatchqueuelink = BQ.id INNER JOIN batchqueue QCBQ ON T.qcbatchqueuelink = QCBQ.id INNER JOIN userdetail QCUD ON QCBQ.assignedto = QCUD.id INNER JOIN userdetail DEUD ON BQ.assignedto = DEUD.id WHERE TE.inactive='t' AND TE.status IN ('ERROR','QCCORRECTED') LIMIT 0
方案说明
- 第一个
createdate是日期类型的平级列,存储源表原生的日期值,可直接通过列名createdate访问 - 第二个
createdate是jsonb类型的平级列,内部存储格式化后的日期字符串,需要通过createdate->>'createdate'访问格式化后的值 - 该方案完全满足两个字段对外名称均为
createdate的要求,不会触发重名报错
如果业务实际要求的是两个平级字段完全同名,属于违反数据库基础规则的需求,技术上无法实现,建议和业务方确认需求细节。常规开发场景下,格式化后的日期字段一般会命名为createdate_str、createdate_fmt这类带区分度的别名,是通用性、可维护性最高的写法。
内容的提问来源于stack exchange,提问作者Osama Imam
相关产品推荐
相关产品推荐

