Ответ 1
SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))
Вы всегда можете отрицать WHERE (condition)
с помощью WHERE NOT (condition)
Я использую собственный тип массива 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))
Какой правильный способ проверить это условие?
SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))
Вы всегда можете отрицать WHERE (condition)
с помощью WHERE NOT (condition)
Вы можете немного повернуть его и сказать, что "3 не равно всем идентификаторам":
where 3 != all (recipient_ids)
9.21.4. ALL (массив)
expression operator ALL (array expression)
Правая часть - это выражение в скобках, которое должно давать значение массива. Левое выражение оценивается и сравнивается с каждым элементом массива с использованием заданного оператора , который должен приводить к логическому результату. Результатом
ALL
является "true", если все сравнения дают значение true (включая случай, когда массив имеет нулевые элементы). Результатом является "false", если найден какой-либо ложный результат.
not (3 = any(recipient_ids))
?
Обратите внимание, что операторы 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)
обновление:
как и в postgres 9.3,
вы можете использовать NOT
в тандеме с @>
(содержит оператор), чтобы достичь этого.
IE.
SELECT COUNT(*) FROM "messages" WHERE NOT recipient_ids @> ARRAY[3];