数组与 Postgres 中的数组重叠
Array overlaps an array in Postgres
我正在按标签功能进行搜索,table 像这样
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"}';
这不是(returns 一个空数组,当它应该是我要查找的行时)
select * from "permission" where tags @> '{"artist", "event"}';
为什么有多个标签的那个不起作用?
@>
is the "contains" operator 所以当 a1
包含 a2
中的所有元素时 a1 @> a2
为真。例如:
array['artist', 'default'] @> array['artist'] -- True
array['artist', 'default'] @> array['default', 'artist'] -- True
array['artist', 'default'] @> array['artist', 'event'] -- False
因此 @>
检查右操作数是否是左操作数的集合子集。
我认为您正在寻找 "overlaps" 运算符:
&&
overlap (have elements in common)
ARRAY[1,4,3] && ARRAY[2,1] -- True
此运算符检查左右操作数的集合交集是否非空。
类似于:
.whereRaw("tags && '{??}'", [tags])
应该更好地为您服务。
我正在按标签功能进行搜索,table 像这样
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"}';
这不是(returns 一个空数组,当它应该是我要查找的行时)
select * from "permission" where tags @> '{"artist", "event"}';
为什么有多个标签的那个不起作用?
@>
is the "contains" operator 所以当 a1
包含 a2
中的所有元素时 a1 @> a2
为真。例如:
array['artist', 'default'] @> array['artist'] -- True
array['artist', 'default'] @> array['default', 'artist'] -- True
array['artist', 'default'] @> array['artist', 'event'] -- False
因此 @>
检查右操作数是否是左操作数的集合子集。
我认为您正在寻找 "overlaps" 运算符:
&&
overlap (have elements in common)
ARRAY[1,4,3] && ARRAY[2,1] -- True
此运算符检查左右操作数的集合交集是否非空。
类似于:
.whereRaw("tags && '{??}'", [tags])
应该更好地为您服务。