首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle NULL ON NULL子句无效

Oracle NULL ON NULL子句无效
EN

Stack Overflow用户
提问于 2020-03-10 14:48:52
回答 4查看 4.5K关注 0票数 2

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

代码语言:javascript
复制
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;

也可以:

代码语言:javascript
复制
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;

不幸的是,这两个查询的结果是:

代码语言:javascript
复制
|C1        |C2        |
|----------|----------|
|{"a":1}   |{"a":1}   |

相反,我本以为会这样:

代码语言:javascript
复制
|C1                 |C2        |
|-------------------|----------|
|{"a":1,"b":null}   |{"a":1}   |

我遗漏了什么?我正在使用Oracle XE18c

EN

回答 4

Stack Overflow用户

发布于 2020-03-10 21:12:31

你发现了一个窃听器。我使用不同的空处理程序提交了Bug 31013529 -两个JSON_OBJECT,返回错误的结果。

我们将尽快修复它,并将其包含在包补丁中。如果你需要一次性补片,请告诉我们。

谢谢b

票数 3
EN

Stack Overflow用户

发布于 2020-03-10 16:20:40

对我来说好像是个虫子:

代码语言:javascript
复制
select 
  json_object(key 'a' value 1, key 'b' value null null on null)   c1
  ,(SELECT json_object(key 'a' value 1, key 'b' value null absent on null) FROM dual) c2
from dual

输出:

代码语言:javascript
复制
+-------------------+---------+
|        C1         |   C2    |
+-------------------+---------+
| {"a":1,"b":null}  | {"a":1} |
+-------------------+---------+

db<>fiddle demo

当用(SELECT exp FROM dual)包装更改结果集(https://stackoverflow.com/a/52561721/5070879)时,就会出现这些奇怪的情况之一。

我想,是一些优化机制(“公共子表达式消除”)导致对exp进行一次第一次/最后一次发生的评估。如果您更改了键,它就会正常工作:

代码语言:javascript
复制
select 
  json_object(key 'a' value 1, key 'b' value null null on null)   c1, 
  json_object(key 'a' value 1, key 'c' value null absent on null) c2
from dual;

db<>fiddle demo

票数 1
EN

Stack Overflow用户

发布于 2020-03-11 09:26:57

Lukasz的答案提供了一个可行的解决方法,使用相关的子查询。

为了记录在案,其他函数也会受到影响,例如JSON_ARRAYAGG

代码语言:javascript
复制
select
  json_arrayagg(a null on null) c1,
  json_arrayagg(a absent on null) c2
from (
  select 1 a from dual union all select null a from dual
) t;

产量:

代码语言:javascript
复制
|C1        |C2        |
|----------|----------|
|[1]       |[1]       |

而这个解决办法..。

代码语言:javascript
复制
select 
  cast(json_arrayagg((select a from dual) absent on null) as varchar2(10)) c2,
  cast(json_arrayagg((select a from dual) null on null) as varchar2(10)) c1
from (
  select 1 a from dual union all select null a from dual
) t;

产生正确的结果:

代码语言:javascript
复制
|C2        |C1        |
|----------|----------|
|[1]       |[1,null]  |
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60620047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档