Подтвердить что ты не робот

Postgres НЕ в массиве

Я использую собственный тип массива Postgres и пытаюсь найти записи, в которых идентификатор отсутствует в идентификаторах получателей массива.

Я могу найти, где они IN:

SELECT COUNT(*) FROM "messages" WHERE (3 = ANY (recipient_ids))

Но это не работает:

SELECT COUNT(*) FROM "messages" WHERE (3 != ANY (recipient_ids))
SELECT COUNT(*) FROM "messages" WHERE (3 = NOT ANY (recipient_ids))

Какой правильный способ проверить это условие?

4b9b3361

Ответ 1

SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))

Вы всегда можете отрицать WHERE (condition) с помощью WHERE NOT (condition)

Ответ 2

Вы можете немного повернуть его и сказать, что "3 не равно всем идентификаторам":

where 3 != all (recipient_ids)

Из точное руководство:

9.21.4. ALL (массив)

expression operator ALL (array expression)

Правая часть - это выражение в скобках, которое должно давать значение массива. Левое выражение оценивается и сравнивается с каждым элементом массива с использованием заданного оператора , который должен приводить к логическому результату. Результатом ALL является "true", если все сравнения дают значение true (включая случай, когда массив имеет нулевые элементы). Результатом является "false", если найден какой-либо ложный результат.

Ответ 3

not (3 = any(recipient_ids))?

Ответ 4

Обратите внимание, что операторы ANY/ALL не будут работать с индексами массива. Если указатели имеют в виду:

SELECT COUNT(*) FROM "messages" WHERE 3 && recipient_ids

и отрицательный:

SELECT COUNT(*) FROM "messages" WHERE NOT (3 && recipient_ids)

Затем может быть создан индекс, например:

CREATE INDEX recipient_ids_idx on tableName USING GIN(recipient_ids)

Ответ 5

обновление:

как и в postgres 9.3,

вы можете использовать NOT в тандеме с @> (содержит оператор), чтобы достичь этого.

IE.

SELECT COUNT(*) FROM "messages" WHERE NOT recipient_ids @> ARRAY[3];