sql - 来自 json_value 的科学记数法数字与另一个数字不匹配
问题描述
我遇到了一个问题,我需要匹配两个表中的数字。
我的第一张桌子有下一个数字,例如:
AMOUNT
------------
123456789,92
我的第二张桌子有:
MSGTOSEND_0182
-------------------------------------------------------------------------------------------------------------------------
{"amount":1.2345678992E8,"notes":"Nomina a Martin","transactionDetails":{"transactionChannelId":"_ach_enviada"}}
我的查询将这些与以下内容进行比较:
REPLACE(AMOUNT, ',', '.')) = REPLACE(JSON_VALUE(MSGTOSEND_0182, '$.amount'), ',', '.'))
结果为空,不匹配,但如果我在 Notepad++ 中解析 JSON,数字是相同的。
为什么它们在 Oracle 中不匹配?
解决方案
虽然简单的数字比较适用于 18c:
select *
from zmt join po
on ZMT.AMOUNT = JSON_VALUE(PO.MSGTOSEND_0182, '$.amount' RETURNING NUMBER)
...它在早期版本中不起作用 - 至少在json_value
首次引入的 12cR1 中。NLS_NUMERIC_CHARACTERS
设置为(因此'.,'
句点作为小数分隔符)您的字符串版本匹配,但数字版本不匹配;并且使用',.'
(所以逗号作为小数分隔符,正如您似乎拥有的那样)字符串或数字版本都不匹配。
作为一种解决方法,您可以将 JSON 值作为字符串获取,然后将其显式转换为数字:
select *
from zmt join po
on ZMT.AMOUNT = TO_NUMBER(
JSON_VALUE(PO.MSGTOSEND_0182, '$.amount' RETURNING VARCHAR2(20)),
'9.9999999999EEEE', 'nls_numeric_characters=''.,''')
...这在 18c中不起作用,因为 JSON 值以数字形式返回(或者至少是格式化为字符串的数字);这不是不合理的。但是版本之间是不一致的。
推荐阅读
- c# - 使用对象分配索引值时出错
- python - 获取使用传递引用的 COM 对象的返回值
- javascript - 从文件读取时未定义
- azure - Azure Active Directory 双重同意、非确定性流
- mysql - 如何使用 Knex.js 在 MySQL 上编写“FORCE INDEX (index_key)”?
- applescript - 使用 Applescript 将图像文件夹复制到另一个文件夹时遇到问题
- rest - 如何处理微服务架构中的指数调用层次结构?
- image - Fluttes 不更新图像状态
- c++ - 在 Docker 中调试 .NET Core 应用程序 - 附加到非托管代码
- google-apps-script - 谷歌表 onedit 方法会导致脚本崩溃,否则会起作用?