首页 > 解决方案 > 来自 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 中不匹配?

标签: sqljsonoraclescientific-notation

解决方案


虽然简单的数字比较适用于 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 值以数字形式返回(或者至少是格式化为字符串的数字);这不是不合理的。但是版本之间是不一致的。


推荐阅读