id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL UNIQUE,
content TEXT NOT NULL,
groups uuid[] NOT NULL
);
CREATE TABLE groups
(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL UNIQUE,
read BOOLEAN NOT NULL,
write BOOLEAN NOT NULL,
users uuid[] NOT NULL
);
Есть две таблицы. Я пытаюсь достать имя группы по id из файла таким запросом
select g.name from groups as g where g.id = any (select f.groups from files as f where name = 'hello');
Но выдает ошибку
ERROR: operator does not exist: uuid = uuid[]
LINE 1: select g.name from groups as g where g.id = any (select f.gr...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
Почему так, если я возвращаю тип uuid[]?
Сделайте через exists
Не понимаю, что поменять на exists. Он же мне просто вернет присутствие строк
Потому что подобный синтаксис может означать две разные вещи, т.е. есть "operator ANY (array)" и "operator ANY (select query)". Чтобы выбрать нужный, попробуйте что-то вроде: = ANY((select f.groups from files as f where name = 'hello')::uuid[])
Понял. Работает, спасибо!:) select g.name from groups as g where exists (select 1 from files as f where g.id = any (f.groups) and f.name = 'hello');
Уже переделал на exists, спасибо за объяснение:)
Ну вот, не так уж и сложно. 😀
Обсуждают сегодня