sql - 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
,这应该会加快查询速度。
推荐阅读
- visual-studio - 使用 CMake 生成构建系统时选择 MSVS 构建配置
- ios - canOpenURL 返回 true 并且应用程序已安装但应用程序未打开
- cookies - 无法使用 JavaScript 删除 cookie - 我做错了什么?
- c - 在 pthread_create 中创建的函数接受指向 int 的指针时的奇怪行为
- amazon-web-services - 新数据的 Elasticache / Redis 时间戳
- c# - 如何将支付线转入Sage 50?
- angular - Angular 9 NgRx - 在文件上传时检测到不可序列化的操作
- entity-framework-core - 将 efCore 从 2.2 更新到 3.1 时拥有的实体
- python - 在 Python 中选择平滑参数并实现非参数回归
- wix - 如何在 WIX 项目的版本属性中分配字符串