0

我们有一个充满类型字符串的数据库:

无法写入块。EOM 上的设备。开发=$device ($device_path)

然后,我们的程序会生成日志条目,例如

2013-10-10 15:37:07program-sd JobId 50345:致命错误:block.c:434 无法写入块。EOM 上的设备。开发=“st0”(/开发/st0)

因此,我们可以使用SELECT * FROM X WHERE Y LIKE="%LOG%"但是,字符串不一样,在我们的数据库中,我们有一个干净的字符串,而在我们的日志中,我们有时间戳、更多信息以及 and 的数据$device$device_path所以查询将返回 0 个结果,因为两者都不匹配...

我们试图根据我们在数据库中的内容返回一个错误代码,对于这个例子,RC: 1019如果查询的结果不是 0...

有什么方法可以使用正则表达式或其他方法来完成此任务吗?

4

1 回答 1

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_)组成 - 您可能需要根据实际变量名称进行调整。

另请注意,这可能会很慢。它必须扫描整个表;不能使用索引。

于 2013-12-05T11:41:17.177 回答