阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 12c疑似bug:json_value(null, …)可能出现重复记录

251次阅读
没有评论

共计 976 个字符,预计需要花费 3 分钟才能阅读完成。

一、问题描述

最近,用户抱怨 Oracle 12c 的某个查询结果出现了有重复记录的情况。经调查分析,查询 sql 涉及到 json_value 函数,可简化为:

select ID, json_value(json_field, ‘$.Code’), json_value(json_field, ‘$.Time’)
from json_table where ID=390;

在不同的测试库中,有时结果为一条记录(正确),有时为二条记录(错误)。

再进一步分析,发现出现改问题的记录,json_field 的内容均为 null。

二、疑似 bug 的证据

在网上没有搜索到类似情况,但依然认为其为疑似 bug,证据为:

1 当 sql 只使用一个 json_value 函数时,查询结果始终正确:

select ID, json_value(json_field, ‘$.Code’) from json_table where ID=390;
select ID, json_value(json_field, ‘$.Time’) from json_table where ID=390;

两条语句均只返回一条记录。

2 使用 count(*) 时,查询结果始终正确:

create or replace view json_view as
select ID, json_value(json_field, ‘$.Code’), json_value(json_field, ‘$.Time’) from json_table ;

select * from json_view; — 结果为 2 条记录

select count(*) from json_view; – 结果为 1

三、解决办法

猜测是 json_value 函数在解析 null 时出现了偏差,那么把 null 转换为最简单的有效 json 即可:

select ID, json_value(nvl(json_field, ‘{}’), ‘$.Code’), json_value(nvl(json_field, ‘{}’), ‘$.Time’)
from json_table where ID=390;
— 结果始终是一条记录

PS:

  • 如果 sql 中涉及多个空的 json 字段,那么可能出现更多的重复记录。
  • 原始数据涉及客户机密,只好如此处理。

更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计976字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中