数组与 Postgres 中的数组重叠

Vla*_*nov 3 javascript sql postgresql typescript knex.js

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

    CREATE TABLE permission (
      id serial primary key,
      tags varchar(255)[],
    );
Run Code Online (Sandbox Code Playgroud)

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

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

  async getByTags(tags: string[]): Promise<PermissionTable[]> {
    return this.db<PermissionTable>('permission')
      .select('*')
      .whereRaw("tags @> '{??}'", [tags])
  }
Run Code Online (Sandbox Code Playgroud)

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

这有效

  async getByTags(tags: string[]): Promise<PermissionTable[]> {
    return this.db<PermissionTable>('permission')
      .select('*')
      .whereRaw("tags @> '{??}'", [tags])
  }
Run Code Online (Sandbox Code Playgroud)

这不会(返回一个空数组,而它应该是我正在查找的行)

    select * from "permission" where tags @> '{"artist"}';
Run Code Online (Sandbox Code Playgroud)

为什么有多个标签的不起作用?

mu *_*ort 5

@>是“包含”运算符,因此当包含 中的所有元素a1 @> a2时为真。例如:a1a2

array['artist', 'default'] @> array['artist']            -- True
array['artist', 'default'] @> array['default', 'artist'] -- True
array['artist', 'default'] @> array['artist', 'event']   -- False
Run Code Online (Sandbox Code Playgroud)

@>检查右操作数是否是左操作数的集合子集也是如此。

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

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

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

就像是:

.whereRaw("tags && '{??}'", [tags])
Run Code Online (Sandbox Code Playgroud)

应该为你提供更好的服务。