Postgresql使用to_char函数处理十六进制格式时报函数不存在错误如何解决?
问题原因
PostgreSQL 原生 to_char 函数不存在「接收文本类型入参、输出十六进制格式」的重载实现,也不支持 Oracle 语法里的 X 类十六进制格式化模板,和 Oracle 的 to_char 设计逻辑不兼容,因此直接迁移语法会触发函数不存在的报错。
解决方法
PostgreSQL 提供了专门的整数转十六进制函数 to_hex,配合类型转换即可实现和 Oracle 语句完全等效的效果:
- 先将字符串格式的大整数转为
bigint数值类型 - 调用
to_hex转十六进制,如需输出大写字母再加一层upper函数
示例代码如下:
-- 输出小写十六进制结果 SELECT to_hex('7374961057827412212'::bigint); -- 运行结果:66592002042458f4 -- 输出和Oracle完全一致的大写结果 SELECT upper(to_hex('7374961057827412212'::bigint)); -- 运行结果:66592002042458F4
特殊场景适配
如果你需要和 Oracle 语法里的 XXXXXXXXXXXXXXXXXXXX 模板一样,固定输出20位长度、不足位左侧补0,可以配合 lpad 函数实现:
SELECT lpad(upper(to_hex('7374961057827412212'::bigint)), 20, '0');
注意事项
如果待转换的整数超过 bigint 取值上限(大于9223372036854775807),可以先将入参转为 numeric 类型后再通过自定义转换逻辑处理,常规整数场景下 bigint 完全够用。
内容的提问来源于stack exchange,提问作者stacks
相关产品推荐
相关产品推荐

