问题描述
你好贝达,
我有一个关于在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” 值的键的问题。
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
感谢您的提问,并为我的延迟答复感到抱歉。
我们基本上处理两个值域: 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
546次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
462次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
443次阅读
2025-04-01 11:08:44
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
440次阅读
2025-04-08 09:12:48
墨天轮个人数说知识点合集
JiekeXu
439次阅读
2025-04-01 15:56:03
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
437次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
412次阅读
2025-04-22 00:13:51
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
407次阅读
2025-04-20 10:07:02
Oracle 19c RAC更换IP实战,运维必看!
szrsu
392次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
353次阅读
2025-04-17 17:02:24