Oracle JSON生成数字格式问题:如何无需to_char返回0.0133?
解决Oracle JSON输出省略前导零的问题
这个问题我之前也碰到过,Oracle默认的JSON数值格式化确实会省略小于1的正数的前导零,不过不用显式to_char也能搞定,有两个实用的方法:
方法一:调整会话级参数
Oracle 12.2及以上版本支持NLS_JSON_NUMERIC_FORMAT参数,它的默认值是'LAX'——这就是为什么你会得到.0133而不是0.0133的原因。把这个参数改成'STRICT',就能让JSON输出的数值强制保留前导零。
执行以下语句设置当前会话:
ALTER SESSION SET NLS_JSON_NUMERIC_FORMAT = 'STRICT';
之后再运行你的原查询,就能得到{"value":0.0133}了。这个设置仅对当前会话生效,如果需要全局生效,你可以修改数据库的初始化参数(需要相应权限)。
方法二:类型转换技巧
如果不想修改会话参数,也可以通过类型转换来实现。把目标数值转换成BINARY_FLOAT或BINARY_DOUBLE类型后,Oracle在序列化JSON时会自动保留前导零。示例查询如下:
select json_object( 'value' is CAST(0.0133 AS BINARY_FLOAT) format json strict) o from dual;
换成BINARY_DOUBLE也能达到同样的效果。
需要注意的是,你原查询里的FORMAT JSON STRICT是用来确保JSON语法合规的,它和数值的格式化规则没有关系,所以之前的设置不会影响前导零的输出。
内容的提问来源于stack exchange,提问作者Alexander Tokarev
相关产品推荐
相关产品推荐

