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'), ',', '.'))

结果为null,不匹配,但如果我在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值是以数字(或者至少是格式化为字符串的数字(的形式返回的;这并非没有道理。但不同版本之间并不一致。

相关内容

  • 没有找到相关文章

最新更新