sql - Postgresql:动态正则表达式模式

标签 sql regex 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 中动态构建模式的等效项是什么?

最佳答案

尝试简单的 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 列上创建索引,这应该会稍微加快查询速度。

关于sql - Postgresql:动态正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51313395/

相关文章:

javascript - 如何在 Javascript 中使用正则表达式删除单词之间的所有空格

postgresql - docker容器未启动时如何恢复docker中的postgres数据库?

python - 比较sqlalchemy核心中的两个uuid

mysql - 如何将新表中的行分组在一起?

mysql - 如何左连接 2 个不同数据库上的 2 个表?

sql - 如何从 X 开始向 SQL-SERVER 中的表添加自动递增 ID 字段

regex - 如何仅从日志文件中 grep 输入的最后 30 天?

mysql - 如何根据依赖的两列中的条件过滤记录

javascript - 如何删除|从头到尾的符号

javascript - 如何在不使用任何库的情况下从前端和后端连接到数据库(PostgreSQL)