javascript - Array overlapper et array i Postgres
Jeg lager en søkefunksjon etter tagger, i en tabell som dette
CREATE TABLE permission (
id serial primary key,
tags varchar(255)[],
);
Så legger jeg til en rad som har taggene "artist" og "default".
Jeg vil gjerne søke på det etter tagger (ved å bruke Knex-spørringsbyggeren), så hvis jeg gjør dette:
async getByTags(tags: string[]): Promise<PermissionTable[]> {
return this.db<PermissionTable>('permission')
.select('*')
.whereRaw("tags @> '{??}'", [tags])
}
Det gir følgende utsagn avhengig av hvor mange tagger du sendte.
Dette fungerer
select * from "permission" where tags @> '{"artist"}';
Dette returnerer ikke (returnerer et tomt array, når det burde være raden jeg leter etter)
select * from "permission" where tags @> '{"artist", "event"}';
Hvorfor fungerer ikke den med flere merkelapper?
Svar #1
@> er "inneholder"-operatoren, så a1 @> a2 er sann når a1 inneholder alle elementene i a2. For eksempel:
array['artist', 'default'] @> array['artist'] -- True
array['artist', 'default'] @> array['default', 'artist'] -- True
array['artist', 'default'] @> array['artist', 'event'] -- False
Så @> sjekker om høyre operand er en delmengde av venstre operand.
Jeg tror du leter etter "overlaps"-operatoren:
&&
overlappe (ha elementer til felles)
ARRAY[1,4,3] && ARRAY[2,1] -- Sant
Denne operatoren sjekker om den mengdevis skjæringen av venstre og høyre operand er ikke-tom.
Noe som:
.whereRaw("tags && '{??}'", [tags])
bør tjene deg bedre.
