Postgres: вернуть true / false, если из внутреннего объединения найдены совпадения? - PullRequest
0 голосов
/ 14 декабря 2018

Я внедрил систему тегов в своем приложении, используя Postgres 9.6.Есть три таблицы.

Проекты

                                         Table "public.project"
   Column    |            Type             | Collation | Nullable |             Default             
-------------+-----------------------------+-----------+----------+---------------------------------
 id          | integer                     |           | not null | nextval('tag_id_seq'::regclass)
 name         | character varying(255)      |           | not null | 
 user_id     | integer                     |           |          | 

Теги

                                         Table "public.tag"
   Column    |            Type             | Collation | Nullable |             Default             
-------------+-----------------------------+-----------+----------+---------------------------------
 id          | integer                     |           | not null | nextval('tag_id_seq'::regclass)
 tag         | character varying(255)      |           | not null | 
 user_id     | integer                     |           |          | 
 is_internal | boolean                     |           | not null | false

Теги проекта

      Column      |            Type             | Collation | Nullable |                 Default                 
------------------+-----------------------------+-----------+----------+-----------------------------------------
 id               | integer                     |           | not null | nextval('project_tag_id_seq'::regclass)
 tag_id           | integer                     |           | not null | 
 project_id | integer                     |           |          |        | 
 user_id          | integer                     |           | not null | 

Теперь я хочу получить список всех аннотированных проектовсо столбцом, который указывает (для конкретного тега), есть ли у него этот тег.

Так что я бы хотел, чтобы результаты выглядели так:

id          name          has_favorite_tag
1           foo           true
2           bar           false
3           baz           false

Это мой запрос до сих пор:

select project.*, CASE(XXXX) as has_project_tag
from project p
join (select * from project_tag where tag_id=1) pt on p.id=pt.project_id

Я знаю, что хочу использовать CASE, чтобы быть истинным, когда длина совпадений project_tag больше 0 - но как мне это сделать?

(На самом делеконечно, в таблице проекта есть еще много полей.)

1 Ответ

0 голосов
/ 14 декабря 2018

Вот возможность (не отфильтрованная для tag_id; добавьте к внутреннему выбору, если необходимо):

select project.*, exists(select * from project_tag where id=project.id) as has_project_tag from project;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...