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.

Relaterte artikler