数组与 Postgres 中的数组重叠

Posted

技术标签:

【中文标题】数组与 Postgres 中的数组重叠【英文标题】:Array overlaps an array in Postgres 【发布时间】:2020-05-06 23:01:33 【问题描述】:

我正在按标签功能进行搜索,在这样的表格中

    CREATE TABLE permission (
      id serial primary key,
      tags varchar(255)[],
    );

然后我添加一个带有“艺术家”和“默认”标签的行。

我想通过标签查询它(使用knex query builder),所以如果我这样做:

  async getByTags(tags: string[]): Promise<PermissionTable[]> 
    return this.db<PermissionTable>('permission')
      .select('*')
      .whereRaw("tags @> '??'", [tags])
  

这会根据您传递的标签数量生成以下语句。

这行得通

    select * from "permission" where tags @> '"artist"';

这不会(返回一个空数组,当它应该是我要查找的行时)

    select * from "permission" where tags @> '"artist", "event"';

为什么多标签的那个不行?

【问题讨论】:

使用 ??替换那里有SQL注入孔。这些仅用于将带有正确引号的标识符名称传递给查询。 【参考方案1】:

@&gt; is the "contains" operator 所以当a1 包含a2 中的所有元素时,a1 @&gt; a2 为真。例如:

array['artist', 'default'] @> array['artist']            -- True
array['artist', 'default'] @> array['default', 'artist'] -- True
array['artist', 'default'] @> array['artist', 'event']   -- False

所以@&gt; 检查右操作数是否是左操作数的集合子集。

我认为您正在寻找“重叠”运算符:

&amp;&amp; 重叠(有共同元素)ARRAY[1,4,3] &amp;&amp; ARRAY[2,1] -- True

此运算符检查左右操作数的集合交集是否非空。

类似:

.whereRaw("tags && '??'", [tags])

应该更好地为您服务。

【讨论】:

以上是关于数组与 Postgres 中的数组重叠的主要内容,如果未能解决你的问题,请参考以下文章

如何按postgres数组中的多个ID分组

如何确定数组中的值是不是存在于 Postgres 表中

Postgres:避免与其他条件重叠范围的最佳方法

从Java中的Postgres加载非物化数组

在 Postgres 中的数组字段上应用聚合函数?

Postgres:计算子查询中的唯一数组条目