zoukankan      html  css  js  c++  java
  • Oracle 12c疑似bug:json_value(null, ...)可能出现重复记录

    一、问题描述

    最近,用户抱怨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字段,那么可能出现更多的重复记录。
    • 原始数据涉及客户机密,只好如此处理。
  • 相关阅读:
    HDU6301 SET集合的应用 贪心
    线段树与树状数组的对比应用
    树状数组
    JDBC链接MySQL数据库
    HDU4686Arc of Dream 矩阵快速幂
    HDU1757矩阵快速幂
    B1013. 数素数 (20)
    B1023. 组个最小数 (20)
    [教材]B1020. 月饼 (25)
    [教材]A1025. PAT Ranking (25)
  • 原文地址:https://www.cnblogs.com/wggj/p/10313475.html
Copyright © 2011-2022 走看看