我们有一个数据库,其中包含以下类型的字符串:
不能写块。 EOM的设备。 dev = $ device($ device_path)
然后,我们的程序会生成日志条目,例如
2013-10-10 15:37:07program-sd JobId 50345:致命错误:block.c:434 不能写块。 EOM的设备。 dev =“st0”(/ dev / st0)
所以,我们可以使用SELECT * FROM X WHERE Y LIKE="%LOG%"
但是,字符串不一样,在我们的数据库中,我们有一个干净的字符串,而在我们的日志中,我们有时间戳,更多信息以及{{的数据1}}和$device
,因此查询将返回0结果,因为两者都不匹配...
我们正在尝试根据数据库中的内容返回错误代码,对于此示例,如果查询结果不为0,则为$device_path
...
有没有办法使用正则表达式或其他方法来实现这一目标?
答案 0 :(得分:1)
假设您的错误消息模板表如下所示:
create table error_templates(id serial primary key, template text);
然后你可以使用这样的查询:
select id
from error_templates
where $1 like '%' || regexp_replace(template, '\$\w+', '%', 'g') || '%';
$ 1是您要查找的错误日志的占位符。
regex_replace用%替换消息中的变量。它假设变量由一个美元符号后跟一个或多个单词字符(a-zA-Z0-9_)组成 - 您可能需要根据实际变量名称进行调整。
另请注意,这可能会很慢。它必须扫描整个表格;索引无法使用。