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 中不匹配?

解决方法

虽然简单的数字比较works in 18c

  Widget build(BuildContext context) {
    return LayoutBuilder(builder: (context,size) {
      final span = TextSpan(text: lorem);
      final tp = TextPainter(text: span,maxLines: 30);
      tp.textDirection = TextDirection.ltr;
      tp.layout(maxWidth: size.maxWidth);
      if (tp.didExceedMaxLines) {
        return Container(color: Colors.red);
      } else {
        return Text(lorem);
      }
    });

...它在早期版本中不起作用 - 至少在 12cR1 中,其中 select * from zmt join po on ZMT.AMOUNT = JSON_VALUE(PO.MSGTOSEND_0182,'$.amount' RETURNING NUMBER) 首次被引入。将 json_value 设置为 NLS_NUMERIC_CHARACTERS (因此句点作为小数点分隔符)您的字符串版本匹配,但数字版本不匹配;并使用 '.,' (所以逗号作为小数点分隔符,正如您所拥有的那样)字符串或数字版本都不匹配。

作为一种解决方法,您可以将 JSON 值作为字符串获取,然后将其显式转换为数字:

',.'

...在 18c 中不起作用,因为 JSON 值以数字形式返回(或者至少是格式化为字符串的数字);这不是不合理的。但是版本之间不一致。