过滤电子邮件和姓名,然后在PostgreSQL 12上使用JSON在两列中进行重复数据删除

丹尼斯

我有emailssenderreporter列。我想在这些列中搜索给定参数并返回唯一值。

让我用示例来解释。这是我的表和记录:

CREATE TABLE public.emails (
  id                bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
    (MAXVALUE 9223372036854775807),
  sender            jsonb NOT NULL,
  reporter      jsonb not null
);

insert into emails (sender, reporter) VALUES ('[{"email": "[email protected]", "name": "dennis1"}]', '[]');
insert into emails (sender, reporter) VALUES ('[{"email": "[email protected]", "name": "dennis1"}]', '[{"email": "[email protected]", "name": "john"}, {"email": "[email protected]", "name": "dennis1"}, {"email": "[email protected]", "name": "dennis2"}]');
insert into emails (sender, reporter) VALUES ('[{"email": "[email protected]", "name": "dennis1"}]', '[]');
insert into emails (sender, reporter) VALUES ('[{"email": "[email protected]", "name": "dennis1"}]', '[]');

我想获取电子邮件地址和名称。我也想避免被骗。只有一封电子邮件和一个名字。我也不想将其作为数组,而是每行一封电子邮件和一个名称。

正在搜寻 john

SELECT
* /* i don't know what to put here pr merge with reporters */
FROM "emails" AS "e"
WHERE (EXISTS (SELECT
    *
  FROM JSONB_ARRAY_ELEMENTS_TEXT("e"."sender") AS "e" ("email")
  WHERE ("e"."email" ~* 'john' or "e"."name" ~* 'john'))
);

的预期结果john

email                 name
[email protected]      john

搜索``(空):

SELECT
* /* i don't know what to put here pr merge with reporters */
FROM "emails" AS "e"
WHERE (EXISTS (SELECT
    *
  FROM JSONB_ARRAY_ELEMENTS_TEXT("e"."sender") AS "e" ("email")
  WHERE ("e"."email" ~* '' or "e"."name" ~* ''))
);

``(空)的预期结果:

email                 name
[email protected]      john
[email protected]   dennis1
[email protected]   dennis2

dennis2在这两个senderreporter,因此,只需要其中的一个。没有骗子。

实际上,这里有一个陷阱。如果senderreporter列至少有一个json对象(不是json数组),则此查询也会失败。

错误: cannot extract elements from an object

这是另一个故事。

在这种情况下,我如何实现我的目标?

演示:https : //dbfiddle.uk/?rdbms=postgres_12&fiddle=1bf9c5f83f5104e2392c31984cb4e939

阿贝里斯托

在搜索之前将数据标准化,然后使用distinct on ()子句删除重复项

with cte as (select x ->> 'name' as name, x ->> 'email' as email
from emails as e, jsonb_array_elements(e.sender || e.reporter) as x)
select distinct on (email) * from cte where 
  name ~* '' or email ~* ''
  --name ~* 'john' or email ~* 'john'
order by email;

Demo

请注意,它将始终扫描整个表,在这种情况下将不应用任何索引。考虑架构规范化

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果应用程序删除然后重新安装怎么办我如何获得电子邮件地址和姓名登录 Apple

cordova-plugin-facebook4 在 loginSuccess 上获取姓名和电子邮件

如何在flutter应用程序的每个屏幕上显示姓名和电子邮件

用户登录并注册后如何显示“姓名”和“电子邮件”等数据

在产品页面输入姓名和电子邮件,并在结账页面保留输入数据

我想使用 sed 清理姓名和电子邮件地址列表

高效地对电子邮件集合进行索引,以按电子邮件域进行排序和过滤

如何在Google登录中的导航抽屉上显示用户详细信息,例如姓名,电子邮件和图像?

SQL更新:通过在@之前添加+ ID对电子邮件地址进行重复数据删除

.mailmap:您可以只匹配姓名,不匹配电子邮件,还是使用通配符电子邮件?

使用最新时间戳和电子邮件 ID 过滤 DynamoDB 表中的值

从电子邮件中删除HTML标记,然后设计电子邮件正文

使用 Powershell 列出电子邮件通讯组名称、成员数量和电子邮件地址,然后导出为 .CSV

使用ajax发送数据,然后发送电子邮件

插入数据库,然后发送电子邮件

比较列和重复数据删除

是否有任何选项可以在不克隆存储库的情况下在 Github 上查看公共存储库的提交作者姓名和电子邮件?

使用选择器访问联系人姓名,电话和电子邮件,而无需使用不赞成使用的代码

如何使用 AWS SDK 发送带有发件人姓名的电子邮件?

kendo对电子邮件字段进行网格过滤

如果电子邮件地址已经存在,请使用注册表,然后使用Springboot和Jpa引发异常

根据systemID,主键和电子邮件删除重复项

使用python连接到Outlook并阅读电子邮件和附件,然后将它们写入输出文件

使用mimekit / mailkit过滤带有附件的电子邮件

如何使用 group by 和 order by 的 LINQ DataTable 对数据进行重复数据删除

如何使用 Microsoft graph api 和 OData 过滤具有特定电子邮件地址或名称的日历事件?

如何在 Docusign 中从 JSON 设置电子邮件主题行和电子邮件消息

使用Nodemailer和GoDaddy托管的电子邮件发送电子邮件

使用 PDO/MySQL 发送和电子邮件附加到电子邮件的自动增量号