首页 > 解决方案 > Postgresql:动态正则表达式模式

问题描述

我有如下所示的事件数据:

 id | instance_id | value
 1  | 1           | a
 2  | 1           | ap
 3  | 1           | app
 4  | 1           | appl
 5  | 2           | b
 6  | 2           | bo
 7  | 1           | apple
 8  | 2           | boa
 9  | 2           | boat
10  | 2           | boa
11  | 1           | appl
12  | 1           | apply

基本上,每一行都是用户键入一个新字母。他们还可以删除字母。

我想创建一个看起来像这样的数据集,我们称之为data

 id | instance_id | value
 7  | 1           | apple
 9  | 2           | boat
12  | 1           | apply

我的目标是提取每个实例中的所有完整单词,同时考虑删除 - 因此仅获取最长的单词或最近输入的单词是不够的。

为此,我打算像这样进行正则表达式操作:

select * from data
where not exists (select * from data d2 where d2.value ~ (d.value || '.'))

实际上,我正在尝试构建一个动态正则表达式,它添加的匹配字符比现有字符多一个,并且特定于它匹配的行。

上面的代码似乎不起作用。在 Python 中,我可以在使用它之前“编译”一个正则表达式模式。PostgreSQL 中动态构建模式的等价物是什么?

标签: sqlregexpostgresql

解决方案


尝试简单的 LIKE 运算符而不是正则表达式模式:

SELECT * FROM data d1
WHERE NOT EXISTS (
  SELECT * FROM data d2
  WHERE d2.value LIKE d1.value ||'_%'
)

演示:https ://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=cd064c92565639576ff456dbe0cd5f39

在列上创建索引value,这应该会加快查询速度。


推荐阅读