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, спасибо за объяснение:)
Ну вот, не так уж и сложно. 😀
Обсуждают сегодня