PostgreSQL 9.4中如何将int4range类型列转换为integer类型?
解决PostgreSQL中int4range转integer的报错问题
这个报错其实很好理解——int4range是PostgreSQL的范围类型,它存储的是一整个整数区间(比如[1,5)就代表1到4的所有整数),不是单个整数,直接用::integer强制转换当然会失败啦。
怎么搞定转换?得先从范围里提取你要的整数
要完成类型转换,你得先从int4range里把对应的单个整数提出来,再转成integer。这里分两种常见情况:
你的范围都是单值区间(比如存的是
[n, n+1),实际就是代表单个整数n)
这种情况直接用lower()函数取区间的下界就行,这就是你要的那个整数:ALTER TABLE cat_tipos_cierre ALTER COLUMN idu_tipo_cierre TYPE integer USING lower(idu_tipo_cierre);要是你的区间是闭合的单值(比如
[n,n]),那用lower()或者upper()结果都一样。需要提取区间的上界或者其他值
如果你要的是区间的最大值,那用upper()的时候得注意:PostgreSQL的int4range默认是左闭右开的,比如[1,5)的上界是5,但实际包含的最大整数是4,这时候得减1:ALTER TABLE cat_tipos_cierre ALTER COLUMN idu_tipo_cierre TYPE integer USING (upper(idu_tipo_cierre) - 1);
先查清楚数据再动手!
执行ALTER之前,强烈建议先查一下你的数据情况,避免转错:
-- 看看每个区间的上下界,确认提取逻辑对不对 SELECT idu_tipo_cierre, lower(idu_tipo_cierre), upper(idu_tipo_cierre) FROM cat_tipos_cierre; -- 检查有没有非单值的区间(如果业务要求必须是单值的话) SELECT idu_tipo_cierre FROM cat_tipos_cierre WHERE upper(idu_tipo_cierre) - lower(idu_tipo_cierre) != 1;
要是查到有非单值的区间,得先搞清楚这些数据的业务意义——是取平均值?最小值?还是先把这些数据调整成单值区间再转换。
内容的提问来源于stack exchange,提问作者Legendarkz
相关产品推荐
相关产品推荐

