暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL NULL和JSON null。相同还是不相同!?

ASKTOM 2019-01-07
421

问题描述

你好贝达,

我有一个关于在JSON中具有 “null” 值的键的问题。

JSON文档:

https://docs.oracle.com/en/database/oracle/oracle-database/18/adjsn/json-data.html#GUID-FBC22D72-AA64-4B0A-92A2-837B32902E2C

表示以下内容:

注意:
就SQL而言,null的JSON值是一个值。
它不是NULL,在SQL中表示缺少值 (丢失,未知或不适用的数据)。
特别是,SQL condition IS NULL对于JSON null值返回false,而SQL condition IS NOT NULL返回true。


然而,以下简单的例子似乎与此矛盾:

创建表t (id号,json_col varchar(32767) 检查 (json_col是json))
/

插入到t值 (1,'{"Key1":"A","Key2":null}')
/

提交
/


以下两个查询都使用 “IS NULL” 谓词,并且它们都返回记录:

从t mytab中选择 *
其中mytab.json_col.Key2为空
/

ID JSON_COL
----------------
1 {
"Key1": "A",
"Key2": 空
}


选择 * 从 (
选择t.*,json_value(json_col,'$.Key2') val
从t
)
其中val为null
/

ID JSON_COL VAL
---------------------------
1 { -
"Key1": "A",
"Key2": 空
}


你能澄清一下这个问题吗?

非常感谢 & 致以最诚挚的问候,
尤迪思·门策尔

专家解答

嗨,尤迪思,

感谢您的提问,并为我的延迟答复感到抱歉。

我们基本上处理两个值域: JSON域中的值域 (具有字符串,布尔值,对象,数组和null) 和Oracle SQL的域 (与ANSI SQL不同,例如)。

您引用的文档中的主要消息是,JSON land中的 'null' 值与SQL land中的NULL值不同。但是,当您调用JSON_VALUE (或简化的点表示法) 时,需要将JSON域中的选定值转换为SQL域中的一个值。在这种情况下,我们将json null映射为SQL NULL。哪种看起来像JSON null和SQL NULL是相同的,但它们不是。它们只是被映射了。

有些情况下差异更明显。例如,如果您使用路径谓词并希望将值与null进行比较: JSON_EXISTS (...,'$.address?(@.city = = null)')。

在这里,比较是使用质量符号 (例如 = = true或 = = “x”) 进行的,而不使用is NULL。另外,如果您传入的SQL绑定变量为NULL,它将不成立。同样,在Oracle中,空字符串 ''不幸的是与VARCHAR2 NULL值相同,这使事情变得更加复杂。

 

从dual中选择1,其中json_exists('{a:null}','$?(@.a = = $ B)' 将NULL传递为b)
*
第1行的错误:
ORA-40576: 在SQL/JSON路径中使用bind变量无效。


SQL> 从dual中选择1,其中json_exists('{a:null}','$?(@.a = = $ B)' 传递 ''作为b);

没有选择行

SQL> 从dual中选择1,其中json_exists('{a:"}','$?(@.a = = $ B)' 传递'' 作为b);

1
----------
1

从dual中选择1,其中json_exists('{a:null}','$?(@.a = = null)' );

1
----------
1

 


 

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论