我在Oracle DB列上有一个(长)JSON字符串,我需要更新。我很幸运,更新只会在相对有限的行数(~50)上进行,因此性能不是最重要的。然而,与往常一样,我们也不希望它也特别低效。
更新查询的目标是查找和修改JSON中的字段:
... "myField":{"$bigdec":"1.23"} ...
我需要取出1.23
,将其转换为(十进制)数字,对其应用公式并将结果放回去。
是否有任何内置的Oracle函数可以让我找到一个表达式并对其进行修改?我能想到的唯一方法就是找到1.23开头和结尾的指数i
和j
,然后找到
SUBSTR(json, 1, i-2) || newNumber || SUBSTR(json, j+1)
理想情况下,我想做的最后一点是必须像我刚才那样摆弄i和j索引,并且必须运行几个SUBSTR
次调用等。
有没有比这更好的东西? 感谢
答案 0 :(得分:1)
您可以使用REGEXP_REPLACE函数(顾名思义)允许正则表达式替换(例如,如果您需要新数字,则取出前3个字符并将它们放在group1中。
update TABLENAME
set json = REGEXP_REPLACE(json, '^(...)', 'before\1afteroldnumber)
或只是
update TABLENAME
set json = REGEXP_REPLACE(json, '1.23', 'newNumber')
还有全球'的修饰符。等等,因为上面的例子只会交换第一次出现。最佳测试首先:
select json, REGEXP_REPLACE...
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm
答案 1 :(得分:1)
这可能有用:
web.config
这里我拿了1.23,将它转换为数字,将其提升到三次幂,将结果四舍五入到两位小数,转换为字符串(注意格式模型中的fm,没有它你会得到一个额外的space - 作为sign,+或 - 的占位符,并在输入字符串中替换。
需要序列号和末尾的内连接来保持每个输入字符串分开;如果您的输入表中没有唯一的列,您可以将其用于此目的,则需要先创建一个。另外,要密切注意$,我需要用\来逃避。(如果你知道要找什么,你会很容易看到它,但如果我没有提醒你,你可能会错过它。)
祝你好运!