问题描述
我遇到了一个问题,我需要匹配两个表中的数字。
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 值以数字形式返回(或者至少是格式化为字符串的数字);这不是不合理的。但是版本之间不一致。