【问题标题】:SQL regex replace for multiple conditionsSQL 正则表达式替换多个条件
【发布时间】:2021-05-12 17:48:24
【问题描述】:

我正在尝试清理一些文本。为此,我提出了以下查询

Select message,
Case
when REGEXP_Count(message, 'Refreshing|update|create', 1, 'i') > 0 then REGEXP_REPLACE(message, 'Refreshing|Update|create', 'Edited',1, 1, 'i')
when REGEXP_Count(message, 'Open|View', 1, 'i') > 0 then REGEXP_REPLACE(message, 'Open|View', 'Viewed',1, 1, 'i')
else message 
end
From audit_log al 

有没有更好的方法来处理这种替换,所以我不必重复 REGEXP 函数两次?我需要处理大约 50 种不同的替换

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql regex


【解决方案1】:

您可以只替换每个值:

REGEXP_REPLACE(REGEXP_REPLACE(message, 'Refreshing|Update|create', 'Edited',1, 1, 'i'
                             ), 'Open|View', 'Viewed', 1, 1, 'i'
              )

这不是 100% 等价的。但是假设消息只有一个字符串,它应该做你想做的事。

【讨论】:

    【解决方案2】:

    拥有 50 个或更多这样的映射,在我看来,您已经跨越了一个门槛,您需要一种不同的解决方案来帮助您更好地管理和维护它。

    你为什么不创建一个包含两列的简单映射表,action 和 actionclass,然后用 ('refreshing','edited'), ('update','edited') 等填充它。

    如果消息中有多个这些关键字,则此解决方案和您的解决方案都会表现异常。此解决方案返回替换不同关键字的同一记录的两个实例,而您的解决方案完全忽略第二个关键字的匹配。

    Select message, Regexp_Replace(message, m.action, m.actiontype,1,1,'i') as newmsg
    From audit_log, Actions m
    Where instr(message, m.action)> 0
    

    【讨论】:

    • 它必须是一个查询,因为我无法创建任何映射表。另一方面,这只是一项临时工作,因此在维护列表方面确实不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2012-01-25
    • 1970-01-01
    • 2012-02-16
    • 2019-02-07
    • 2012-06-10
    • 2020-05-01
    相关资源
    最近更新 更多