在Oracle SQL中用Regex模式替换文本字段的一部分字符串

时间:2016-08-05 16:34:58

标签: sql regex oracle

我在Oracle DB列上有一个(长)JSON字符串,我需要更新。我很幸运,更新只会在相对有限的行数(~50)上进行,因此性能不是最重要的。然而,与往常一样,我们也不希望它也特别低效。

更新查询的目标是查找和修改JSON中的字段:

... "myField":{"$bigdec":"1.23"} ...

我需要取出1.23,将其转换为(十进制)数字,对其应用公式并将结果放回去。

是否有任何内置的Oracle函数可以让我找到一个表达式并对其进行修改?我能想到的唯一方法就是找到1.23开头和结尾的指数ij,然后找到

SUBSTR(json, 1, i-2) || newNumber || SUBSTR(json, j+1)

理想情况下,我想做的最后一点是必须像我刚才那样摆弄i和j索引,并且必须运行几个SUBSTR次调用等。

有没有比这更好的东西? 感谢

2 个答案:

答案 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,+或 - 的占位符,并在输入字符串中替换。

需要序列号和末尾的内连接来保持每个输入字符串分开;如果您的输入表中没有唯一的列,您可以将其用于此目的,则需要先创建一个。另外,要密切注意$,我需要用\来逃避。(如果你知道要找什么,你会很容易看到它,但如果我没有提醒你,你可能会错过它。)

祝你好运!