我试图让 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/