我遇到了一个问题,需要匹配两个表中的数字。
我的第一张表有下一个数字,例如:
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值是以数字(或者至少是格式化为字符串的数字(的形式返回的;这并非没有道理。但不同版本之间并不一致。