PostgreSQL中int4range列转numrange列报错,求正确SQL语句
解决int4range转numrange的ALTER TABLE报错问题
嘿,我之前也踩过这个坑!直接用c_investment_options_size_pk::numrange做类型转换会报错,因为PostgreSQL没办法自动把int4range(整数范围)直接转换成numrange(数值范围)——它需要你明确处理范围的上下边界类型。
正确的修改语句应该是这样的:
ALTER TABLE tb_investment_options ALTER COLUMN c_investment_options_size_pk TYPE numrange USING numrange( lower(c_investment_options_size_pk)::numeric, upper(c_investment_options_size_pk)::numeric, range_merge(c_investment_options_size_pk) );
为什么这样写?
lower(c_investment_options_size_pk)和upper(c_investment_options_size_pk)分别提取原int4range的上下边界值- 用
::numeric把每个整数边界转换成数值类型,这是构建numrange的必要条件 range_merge(c_investment_options_size_pk)用来保留原范围的边界包含规则(比如原范围是左闭右开[)还是全闭[]),确保转换后的数据行为和原来完全一致
另外这个语句也能处理列中的NULL值,因为当原范围是NULL时,lower()和upper()都会返回NULL,numrange(null, null)会生成NULL,和原数据保持一致。
内容的提问来源于stack exchange,提问作者shahzad ise
相关产品推荐
相关产品推荐

