欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Oracle数据库的闪回查询功能

Oracle数据库的闪回查询功能

2024/10/25 2:14:00 来源:https://blog.csdn.net/MYNAH_Li/article/details/143210568  浏览:    关键词:Oracle数据库的闪回查询功能

前言

近期在客户现场办公, 因上游数据错误, 导致数据库中 CLOB 类型字段 ’ RESOURCES ’ 保存的数据’ “parttent”:“False” '存储成 ’ “parttent”:“[False]” ',数据共13000+条,因此使用了sql进行批量修改。

1.执行错误sql为:

UPDATE AQM_REPORT_RESOURCE 
SET RESOURCES = REGEXP_REPLACE(RESOURCES, '[False]', 'False')
WHERE REGEXP_LIKE(RESOURCES, '[False]')

2、导致的结果

全表所有的96W+数据, 只要字段 ‘RESOURCES ’包含 F、a、l、s、e任何一个字符,全部替换成了 False。。。


一、错误原因及正确方式

1、正则表达式模式错误

在正则表达式中,字符集 [] 通常用于匹配单个字符中的任意一个。你使用的 ‘[False]’ 其实会匹配 F、a、l、s、e 五个字符中的任意一个,而不是匹配单词 “False”。因此,这个表达式可能在不必要的行上进行匹配和替换。

  • REGEXP_LIKE(resources, ‘[False]’) 这个条件实际上是检查 resources 列中是否包含 任意一个
    F、a、l、s、e 字符,只要 resources 列中包含这些字符之一,条件就会匹配为TRUE。这会导致几乎所有包含这些字符的行都被认为符合条件。
  • 同理,regexp_replace(resources, ‘[False]’, ‘False’) 也只会替换 resources列中的单个字符,而不是整个字符串 False。

这就是为什么几乎所有的数据都会被匹配,并进行更新。

2、正确SQL

为了将 resources 列中所有的 [False] 替换为 False,你可以正确地使用 REGEXP_REPLACE 函数匹配整个 [False] 字符串,并替换为 False。具体操作如下SQL 语句:

UPDATE aqm_report_resource
SET resources = REGEXP_REPLACE(resources, '\[False\]', 'False')
WHERE REGEXP_LIKE(resources, '\[False\]');

2.1、释义:

  • 正则表达式的修改:
    ‘[False]’:在正则表达式中,[ 和 ] 是特殊字符,表示字符集的开始和结束,因此需要用反斜杠 \ 进行转义,以匹配实际的字符 [ 和 ]。完整的匹配模式为 [False],这将精确匹配 resources 列中的 [False]。
  • REGEXP_REPLACE 函数:
    REGEXP_REPLACE(resources, ‘[False]’, ‘False’):将 resources 列中所有匹配到的 [False] 替换为 False。
  • WHERE 条件:
    WHERE REGEXP_LIKE(resources, ‘[False]’):只更新那些包含 [False] 的记录,避免全表更新。

2.2、操作流程:

验证查询:在执行更新语句之前,建议先用 SELECT 语句检查需要更新的记录。

SELECT * FROM aqm_report_resource
WHERE REGEXP_LIKE(resources, '\[False\]');

更新记录:确认无误后,执行上面的 UPDATE 语句。

二、问题修复

由于前面执行了错误的SQL语句:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com