Я внедрил систему тегов в своем приложении, используя 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 - но как мне это сделать?
(На самом делеконечно, в таблице проекта есть еще много полей.)