Массив перекрывает массив в Postgres - PullRequest
0 голосов
/ 07 мая 2020

Я выполняю поиск по тегам в такой таблице

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

Затем я добавляю строку с тегами «исполнитель» и «по умолчанию».

Я хотел бы запросить его по тегам (используя построитель запросов knex ), поэтому, если я сделаю это:

  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"}';

Почему тот, у кого несколько тегов, не работает?

1 Ответ

1 голос
/ 07 мая 2020

@> - это оператор «содержит» , поэтому 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])

если сервер вам лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...