用于多个条件的SQL正则表达式替换
我正在尝试清理一些文本。为了实现这一点,我提出了以下问题用于多个条件的SQL正则表达式替换,sql,regex,Sql,Regex,我正在尝试清理一些文本。为了实现这一点,我提出了以下问题 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') >
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种不同的替换您只需替换每个值即可:
REGEXP_REPLACE(REGEXP_REPLACE(message, 'Refreshing|Update|create', 'Edited',1, 1, 'i'
), 'Open|View', 'Viewed', 1, 1, 'i'
)
这不是100%等价的。但是假设消息只有一个字符串,它应该做您想要做的事情。对于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
用你正在使用的数据库标记你的问题。它必须是一个查询,因为我无法创建任何映射表。另一方面,这只是一个一次性的工作,所以在维护列表时真的不是问题。