首页 > 解决方案 > where子句包含数组列时如何选择匹配的记录?

问题描述

在一个项目中,我有一个表documents,我必须从中选择所有记录,documents.id因为我有一个documents.recipients.

我需要的结果记录是:

文档 ID 处方ID
1 gmiG_duuBQOX6WblPXpUk
1 TQ7o1lBsrfDPtBeqGnyYt
2 gmiG_duuBQOX6WblPXpUk
2 TQ7o1lBsrfDPtBeqGnyYt

问题是您从表格屏幕截图中看到收件人是一个数组,我不知道如何进行这种匹配。

表格示例

该文档可以有多个收件人,而不仅仅是这个虚拟表中显示的 2 个,我必须将所有文档与一个收件人 ID 匹配。

例如[{r1,d1},{r1,d2},{r2,d3}]

结果我需要能够在 API 中构造一个有效负载,我必须在其中发送一个 OBJ,例如

{
  "phone": null,
  "email": "foo@bar.com",
  "recipients": [{r1,d1},{r1,d2},{r2,d3}]
}

但是,上面的OBJ只是为了信息竞争而添加的。我需要的帮助是构建一个 PostgreSQL 查询,该查询可以导致我之前描述的内容,并解决我与收件人之间的问题是一个数组。

我一直在尝试如下但并不真正了解如何做到这一点:

select
    id,
    recipients
from
    documents d
where
    recipients -> '0' = 'gmiG_duuBQOX6WblPXpUk'

编辑添加了此表属性的屏幕截图

特性

标签: arrayspostgresql

解决方案


使用jsonb包含运算符@>查找收件人包含某个收件人的所有行:

SELECT d.id, 'gmiG_duuBQOX6WblPXpUk'
FROM documents d
WHERE d.recipients @> ARRAY['gmiG_duuBQOX6WblPXpUk'];

推荐阅读