sql - Oracle JSON_OBJECT NULL ON NULL 子句不起作用

标签 sql json oracle oracle18c

我试图让 Oracle 在 SQL NULL 数据上生成 JSON null 值,如下所示:

select 
  json_object(key 'a' value 1, key 'b' value null null on null)   c1, 
  json_object(key 'a' value 1, key 'b' value null absent on null) c2
from dual;

或者还有:

select 
  json_object(key 'a' value a, key 'b' value b null on null)   c1, 
  json_object(key 'a' value a, key 'b' value b absent on null) c2
from (
  select 1 a, null b
  from dual
) t;

不幸的是,这两个查询都会导致:

|C1        |C2        |
|----------|----------|
|{"a":1}   |{"a":1}   |

我本以为会这样:

|C1                 |C2        |
|-------------------|----------|
|{"a":1,"b":null}   |{"a":1}   |

我错过了什么?我正在使用 Oracle XE 18c

最佳答案

Oracle 如何处理 JSON_OBJECT 似乎存在一个错误,它将从语句中的最后一个 JSON_on_null_clause 获取参数并将其应用于所有 JSON_OBJECT 表达式:

CREATE TABLE t ( a,b ) AS
  SELECT 1, null FROM DUAL UNION ALL
  SELECT 2, 'bb' FROM DUAL;

如果你这样做:

select json_object(
         KEY 'a' VALUE a,
         KEY 'b' VALUE b null on null
       ) c1,
       json_object(
         KEY 'a' VALUE a,
         KEY 'b' VALUE b absent on null
       ) c2
from   t;

那么输出是:

C1               | C2              
:--------------- | :---------------
{"a":1}          | {"a":1}         
{"a":2,"b":"bb"} | {"a":2,"b":"bb"}

如果您使用相反的表达式执行相同的查询:

select json_object(
         KEY 'a' VALUE a,
         KEY 'b' VALUE b absent on null
       ) c2,
       json_object(
         KEY 'a' VALUE a,
         KEY 'b' VALUE b null on null
       ) c1
from   t;

那么输出是:

C2               | C1              
:--------------- | :---------------
{"a":1,"b":null} | {"a":1,"b":null}
{"a":2,"b":"bb"} | {"a":2,"b":"bb"}

db<> fiddle here

关于sql - Oracle JSON_OBJECT NULL ON NULL 子句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60620047/

相关文章:

json - composer.lock 文件中的空引用是什么意思?

ios - 内容类型 JSON SIGABRT 错误

javascript - 如果 React 中不存在 JSON 键,如何隐藏 HTML 元素

使用递归的 SQL-Oracle 更新表

sql - 填充 SQL Server 中两个日期之间的缺失日期

Python SQL 单次提交与多次提交

mysql - 从同一张表上的两个帐户返回 bool 值

sql - 如何使用合并打印列名称和值

java - 将 NewProxyConnection 转换为 C3P0ProxyConnection 时出现 ClassCastException

mysql - GROUP BY 也选择非常量列