Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于多个条件的SQL正则表达式替换_Sql_Regex - Fatal编程技术网

用于多个条件的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

用你正在使用的数据库标记你的问题。它必须是一个查询,因为我无法创建任何映射表。另一方面,这只是一个一次性的工作,所以在维护列表时真的不是问题。