Можно найти запись, которая соответствует любому кортежу из списка, например:
SELECT * FROM tags
WHERE (tags.namespace, tags.name) IN (('genre', 'Action'), ('content', 'Violence'));
Но возможно ли найти запись, которая соответствует всем кортежам из списка?
Согласно документации Postgres, это похоже на работу для = ALL
:
Результат ALL - «истина», если all сравнения дают истинное значение (включая случай, когда в массиве нулевые элементы). Результатом будет «ложь», если будет обнаружен какой-либо ложный результат.
Но, как ни странно, этот оператор не кажется совместимым со списком значений кортежа. Я пробовал следующее:
SELECT * FROM tags
WHERE (tags.namespace, tags.name) = ALL (('genre', 'Action'), ('content', 'Violence'));
... что дает мне синтаксическую ошибку в первой запятой.
Я также пробовал:
SELECT * FROM tags
WHERE (tags.namespace, tags.name) = ALL (ARRAY[('genre', 'Action'), ('content', 'Violence')]);
. .. что дает мне прекрасный cannot compare dissimilar column types namespace and unknown at record column 1
.
В идеале я хотел бы сохранить решение в формате списка значений.
Вот схема таблицы tags
:
CREATE TYPE namespace AS ENUM ('genre', 'type', 'content', 'any');
CREATE TABLE tags (
comic UUID NOT NULL REFERENCES comics ON DELETE CASCADE,
namespace namespace NOT NULL,
name VARCHAR NOT NULL,
PRIMARY KEY(comic, namespace, name)
);