javascript - 数组与 Postgres 中的数组重叠

标签 javascript sql postgresql typescript knex.js

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

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

然后我添加一行,其中包含标签“artist”和“default”。

我想通过标签查询它(使用 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"}';

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

最佳答案

@> is the "contains" operator因此,当 a1 包含 a2 中的所有元素时,a1 @> a2 为 true。例如:

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

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

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

&&
overlap (have elements in common)
ARRAY[1,4,3] && ARRAY[2,1] -- True

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

类似于:

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

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

关于javascript - 数组与 Postgres 中的数组重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61646931/

相关文章:

javascript - 双击/选择单词时在 Chrome 扩展中运行函数

javascript - DOM 的某个元素中的 Keydown 事件

mysql - 如何将结果从一行链接到同一张表上的另一行

MySQL:如何在更改前使用值更新列

oracle - 从日期列中删除时间

postgresql - 在 bool 列上使用 CASE WHEN

javascript - AngularJs 自定义过滤器在我的情况下不起作用

javascript - Ember : How to get mouse event in a view that's not the target

python - 通过 MySQL 更新增加的值

sql - 如何使用来自其他表的不同值更新多行?