数组与 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】:@>
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
所以@>
检查右操作数是否是左操作数的集合子集。
我认为您正在寻找“重叠”运算符:
&&
重叠(有共同元素)ARRAY[1,4,3] && ARRAY[2,1] -- True
此运算符检查左右操作数的集合交集是否非空。
类似:
.whereRaw("tags && '??'", [tags])
应该更好地为您服务。
【讨论】:
以上是关于数组与 Postgres 中的数组重叠的主要内容,如果未能解决你的问题,请参考以下文章